📄 area.cpp
字号:
packet.u.server_npc_remove.server_id = id + 10000;
QueuePacket(c, cn, &packet, 1);
if (NPCList[id].ctrlpc == cn)
{
NPCList[id].ctrlpc = -1;
for (int i = 0 ; i < MAX_PC_CONTROL_NPC ; ++i)
{
if (c[cn].chrlst.ctrlnpc[i] == id)
{
c[cn].chrlst.ctrlnpc[i] = -1;
}
}
}
break;
}
case 3:
{
t_packet packet;
packet.h.header.type = CMD_ITEM_REMOVE;
packet.h.header.size = sizeof(t_server_item_remove);
packet.u.server_item_remove.item_id = id;
QueuePacket(c, cn, &packet, 1);
break;
}
}
return 1;
}
int GetAreaTableCount(t_connection c[], int cn, int type)
{
if (type == 0) // PC
{
for (int i = 0; i < MAX_AREA_BUFFER; ++i)
{
if (c[cn].area_tbl[i].bAlive == FALSE)
{
return i;
}
}
}
else // NPC
{
for (int i = 0; i < MAX_AREA_BUFFER; ++i)
{
if (NPCList[cn].area_tbl[i].bAlive == FALSE)
{
return i;
}
}
}
return -1;
}
int AddAreaNPCTable(t_connection c[], int cn, int type, int id)
{
for (int i = 0; i < MAX_AREA_BUFFER; ++i)
{
if (NPCList[id].area_tbl[i].bAlive == TRUE)
{
if (NPCList[id].area_tbl[i].Type == 1 && NPCList[id].area_tbl[i].ID == cn)
{
return 0;
}
}
}
int cnt = GetAreaTableCount(c, id, 1);
if (cnt < 0)
{
return -1;
}
NPCList[id].area_tbl[cnt].Type = 1;
NPCList[id].area_tbl[cnt].ID = cn;
NPCList[id].area_tbl[cnt].bAlive = TRUE;
return 1;
}
int AddAreaTable(t_connection c[], int cn, int type, int id)
{
if (type == 2) // NPC
{
AddAreaNPCTable(c, cn, type, id);
}
for (int i = 0; i < MAX_AREA_BUFFER; ++i)
{
if (c[cn].area_tbl[i].bAlive == TRUE)
{
if (c[cn].area_tbl[i].Type == type && c[cn].area_tbl[i].ID == id)
{
return 0;
}
}
}
const int cnt = GetAreaTableCount(c, cn, 0);
if (cnt < 0)
{
return -1;
}
c[cn].area_tbl[cnt].Type = type;
c[cn].area_tbl[cnt].ID = id;
c[cn].area_tbl[cnt].bAlive = TRUE;
SendAddArea(c, cn, type, id);
return 1;
}
int CheckAreaPC(t_connection c[], int cn, int ID)
{
if (c[ID].chrlst.X >= c[cn].chrlst.X-ADD_AREA_X &&
c[ID].chrlst.X <= c[cn].chrlst.X+ADD_AREA_X &&
c[ID].chrlst.Y >= c[cn].chrlst.Y-ADD_AREA_Y &&
c[ID].chrlst.Y <= c[cn].chrlst.Y+ADD_AREA_Y)
{
if (AddAreaTable(c, cn, 1, ID) < 0)
{
return -1;
}
return 1;
}
return 0;
}
int CheckAreaAllPC(t_connection c[], int cn)
{
for (int i = 0; i < PC_COUNT; ++i)
{
if (PC_TABLE[i].ID != cn)
{
if (CheckAreaPC(c, cn, PC_TABLE[i].ID) == 1)
{
AddAreaTable(c, PC_TABLE[i].ID, 1, cn);
}
}
}
for (int j = 0; j < NPC_COUNT; ++j)
{
if (NPC_TABLE[j].X >= c[cn].chrlst.X-ADD_AREA_X &&
NPC_TABLE[j].X <= c[cn].chrlst.X+ADD_AREA_X &&
NPC_TABLE[j].Y >= c[cn].chrlst.Y-ADD_AREA_Y &&
NPC_TABLE[j].Y <= c[cn].chrlst.Y+ADD_AREA_Y)
{
if (AddAreaTable(c, cn, 2, NPC_TABLE[j].ID) < 0)
{
break;
}
}
}
for (int k = 0; k < ITEM_COUNT; ++k)
{
if (ITEM_TABLE[k].X >= c[cn].chrlst.X-ADD_AREA_X &&
ITEM_TABLE[k].X <= c[cn].chrlst.X+ADD_AREA_X &&
ITEM_TABLE[k].Y >= c[cn].chrlst.Y-ADD_AREA_Y &&
ITEM_TABLE[k].Y <= c[cn].chrlst.Y+ADD_AREA_Y)
{
if (AddAreaTable(c, cn, 3, ITEM_TABLE[k].ID) < 0)
{
break;
}
}
}
return 1;
}
void RemoveAllPC(t_connection c[], int cn)
{
for (int i = 0; i < PC_COUNT; ++i)
{
if (PC_TABLE[i].ID != cn)
{
for (int j = 0; j < MAX_AREA_BUFFER; ++j)
{
if (c[PC_TABLE[i].ID].area_tbl[j].bAlive == TRUE)
{
if (c[PC_TABLE[i].ID].area_tbl[j].Type == 1 && c[PC_TABLE[i].ID].area_tbl[j].ID == cn)
{
c[PC_TABLE[i].ID].area_tbl[j].bAlive = FALSE;
SendRemoveArea(c, PC_TABLE[i].ID, 1, cn);
}
}
}
}
}
}
int RemoveAreaAllPC(t_connection c[], int cn)
{
for (int i = 0; i < MAX_AREA_BUFFER; ++i)
{
int x = 0, y = 0;
if (c[cn].area_tbl[i].bAlive == TRUE)
{
if (c[cn].area_tbl[i].Type == 1) // PC
{
x = c[c[cn].area_tbl[i].ID].chrlst.X;
y = c[c[cn].area_tbl[i].ID].chrlst.Y;
if (x <= c[cn].chrlst.X-REM_AREA_X ||
x >= c[cn].chrlst.X+REM_AREA_X ||
y <= c[cn].chrlst.Y-REM_AREA_Y ||
y >= c[cn].chrlst.Y+REM_AREA_Y)
{
c[cn].area_tbl[i].bAlive = FALSE;
SendRemoveArea(c, cn, 1, c[cn].area_tbl[i].ID);
for (int j = 0; j < MAX_AREA_BUFFER; ++j)
{
if (c[c[cn].area_tbl[i].ID].area_tbl[j].bAlive == TRUE)
{
if (c[c[cn].area_tbl[i].ID].area_tbl[j].Type == 1 && c[c[cn].area_tbl[i].ID].area_tbl[j].ID == cn)
{
c[c[cn].area_tbl[i].ID].area_tbl[j].bAlive = FALSE;
SendRemoveArea(c, c[cn].area_tbl[i].ID, 1, cn);
}
}
}
}
}
else if(c[cn].area_tbl[i].Type == 2) // NPC
{
x = NPCList[c[cn].area_tbl[i].ID].X;
y = NPCList[c[cn].area_tbl[i].ID].Y;
if (x <= c[cn].chrlst.X-REM_AREA_X ||
x >= c[cn].chrlst.X+REM_AREA_X ||
y <= c[cn].chrlst.Y-REM_AREA_Y ||
y >= c[cn].chrlst.Y+REM_AREA_Y)
{
c[cn].area_tbl[i].bAlive = FALSE;
SendRemoveArea(c, cn, 2, c[cn].area_tbl[i].ID);
}
}
else if(c[cn].area_tbl[i].Type == 3) // ITEM
{
x = ItemList[c[cn].area_tbl[i].ID].x;
y = ItemList[c[cn].area_tbl[i].ID].y;
if (x <= c[cn].chrlst.X-REM_AREA_X ||
x >= c[cn].chrlst.X+REM_AREA_X ||
y <= c[cn].chrlst.Y-REM_AREA_Y ||
y >= c[cn].chrlst.Y+REM_AREA_Y)
{
c[cn].area_tbl[i].bAlive = FALSE;
SendRemoveArea(c, cn, 3, c[cn].area_tbl[i].ID);
}
}
else
{
continue;
}
}
}
return 1;
}
int CheckAreaAllNPC(t_connection c[], int n)
{
for (int i = 0; i < PC_COUNT; ++i)
{
if (NPCList[n].X >= c[PC_TABLE[i].ID].chrlst.X-ADD_AREA_X &&
NPCList[n].X <= c[PC_TABLE[i].ID].chrlst.X+ADD_AREA_X &&
NPCList[n].Y >= c[PC_TABLE[i].ID].chrlst.Y-ADD_AREA_Y &&
NPCList[n].Y <= c[PC_TABLE[i].ID].chrlst.Y+ADD_AREA_Y)
{
AddAreaTable(c, PC_TABLE[i].ID, 2, n);
}
}
return 0;
}
int RemoveAllNPC(t_connection c[], int n)
{ // 葛电 PC俊辑 NPC n阑 力芭茄促.
for (int i = 0; i < PC_COUNT; ++i)
{
for (int j = 0; j < MAX_AREA_BUFFER; ++j)
{
if (c[PC_TABLE[i].ID].area_tbl[j].bAlive == TRUE)
{
if (c[PC_TABLE[i].ID].area_tbl[j].Type == 2 && c[PC_TABLE[i].ID].area_tbl[j].ID == n)
{
c[PC_TABLE[i].ID].area_tbl[j].bAlive = FALSE;
SendRemoveArea(c, PC_TABLE[i].ID, 2, n);
}
}
}
}
return 0;
}
int RemoveAreaAllNPC(t_connection c[], int n)
{
for (int i = 0; i < MAX_AREA_BUFFER; ++i)
{
if (NPCList[n].area_tbl[i].bAlive == TRUE)
{
const int cn = NPCList[n].area_tbl[i].ID;
const int x = c[cn].chrlst.X;
const int y = c[cn].chrlst.Y;
if (NPCList[n].X <= x-REM_AREA_X ||
NPCList[n].X >= x+REM_AREA_X ||
NPCList[n].Y <= y-REM_AREA_Y ||
NPCList[n].Y >= y+REM_AREA_Y)
{
NPCList[n].area_tbl[i].bAlive = FALSE;
SendRemoveArea(c, cn, 2, n);
for (int j = 0; j < MAX_AREA_BUFFER; j ++)
{
if (c[cn].area_tbl[j].bAlive == TRUE)
{
if (c[cn].area_tbl[j].Type == 2 && c[cn].area_tbl[j].ID == n)
{
c[cn].area_tbl[j].bAlive = FALSE;
SendRemoveArea(c, cn, 2, n);
}
}
}
}
}
}
return 0;
}
int CheckAreaAllItem(t_connection c[], int n)
{
for (int i = 0; i < PC_COUNT; ++i)
{
if (ItemList[n].x >= c[PC_TABLE[i].ID].chrlst.X-ADD_AREA_X &&
ItemList[n].x <= c[PC_TABLE[i].ID].chrlst.X+ADD_AREA_X &&
ItemList[n].y >= c[PC_TABLE[i].ID].chrlst.Y-ADD_AREA_Y &&
ItemList[n].y <= c[PC_TABLE[i].ID].chrlst.Y+ADD_AREA_Y)
{
AddAreaTable(c, PC_TABLE[i].ID, 3, n);
}
}
return 0;
}
int CommandAllItem(t_connection c[], int n, int command)
{
for (int i = 0; i < PC_COUNT; ++i)
{
for (int j = 0; j < MAX_AREA_BUFFER; ++j)
{
if (c[PC_TABLE[i].ID].area_tbl[j].bAlive == TRUE)
{ // Type捞 酒捞袍捞搁辑 n锅掳 Item捞搁...
if (c[PC_TABLE[i].ID].area_tbl[j].Type == 3 && c[PC_TABLE[i].ID].area_tbl[j].ID == n)
{
switch (command)
{
case CHANGE_IA2_DURATION_ITEM_AREA:
{
SendItemAttrChange(c, PC_TABLE[i].ID, n, IATTR_DURATION);
break;
}
case CHANGE_IA2_LIMIT_ITEM_AREA:
{
SendItemAttrChange(c, PC_TABLE[i].ID, n, IATTR_LIMIT);
break;
}
case CHANGE_IA2_ATTR_ITEM_AREA:
{
SendItemAttrChange(c, PC_TABLE[i].ID, n, IATTR_ATTR);
break;
}
case CHANGE_IA2_ID_ITEM_AREA:
{
SendItemAttrChange(c, PC_TABLE[i].ID, n, IATTR_ID);
break;
}
case CHANGE_IA2_RESERVED0_ITEM_AREA:
{
SendItemAttrChange( c, PC_TABLE[i].ID, n, IATTR_RESERVED0 );
break;
}
case CHANGE_IA2_RESERVED1_ITEM_AREA:
{
SendItemAttrChange(c, PC_TABLE[i].ID, n, IATTR_RESERVED1);
break;
}
case ITEM_EXPLOTION_AREA:
{
SendItemExplotion( PC_TABLE[i].ID, n );
break;
}
}
}
}
}
}
return 0;
}
int RemoveAllItem(t_connection c[], int n)
{
for (int i = 0; i < PC_COUNT; ++i)
{
for (int j = 0; j < MAX_AREA_BUFFER; ++j)
{
if (c[PC_TABLE[i].ID].area_tbl[j].bAlive == TRUE)
{
if (c[PC_TABLE[i].ID].area_tbl[j].Type == 3 && c[PC_TABLE[i].ID].area_tbl[j].ID == n)
{
c[PC_TABLE[i].ID].area_tbl[j].bAlive = FALSE;
SendRemoveArea(c, PC_TABLE[i].ID, 3, n);
}
}
}
}
return 0;
}
int SetArea(int Cmd, int Id)
{
if (CMD_AREA_COUNT >= MAX_CMD_AREA)
{
return -1;
}
CMD_AREA_TABLE[CMD_AREA_COUNT].Cmd = Cmd;
CMD_AREA_TABLE[CMD_AREA_COUNT].ID = Id;
++CMD_AREA_COUNT;
return 1;
}
void RunArea(t_connection c[])
{ //< CSD-CN-031213
PC_COUNT = 0;
CUserManager::HASH_USER mpUser = g_pUserManager->GetUserSet();
for (CUserManager::ITOR_USER i = mpUser.begin(); i != mpUser.end(); ++i)
{
const int idUser = i->second;
CHARLIST* pUser = CheckServerId(idUser);
if (pUser != NULL)
{
PC_TABLE[PC_COUNT].ID = idUser;
PC_TABLE[PC_COUNT].X = pUser->X;
PC_TABLE[PC_COUNT].Y = pUser->Y;
++PC_COUNT;
}
}
NPC_COUNT = 0;
for (int j = NPC_LIST_START; j < MAX_NPC_LIST; ++j)
{ // 绝绰 惑怕( REMOVE_)捞搁 寸楷洒 器窃且鞘夸 绝档 BUFE_惑怕 溜,
// 努扼捞攫飘俊辑 NPC啊 荤扼瘤绰 矫埃阑 父甸扁 困窃 Term阑 困秦 BUFE_惑怕肚茄 器窃茄促.
CHARLIST* pNpc = CheckNpcId(j);
if (pNpc != NULL && pNpc->bAlive != REMOVE_ && pNpc->bAlive != BUFE_)
{
NPC_TABLE[NPC_COUNT].ID = j;
NPC_TABLE[NPC_COUNT].X = pNpc->X;
NPC_TABLE[NPC_COUNT].Y = pNpc->Y;
++NPC_COUNT;
}
}
ITEM_COUNT = 0;
for (int k = 0; k < MAX_ITEM_LIST; ++k)
{
if (ItemList[k].bAlive == TRUE)
{
ITEM_TABLE[ITEM_COUNT].ID = k;
ITEM_TABLE[ITEM_COUNT].X = ItemList[k].x;
ITEM_TABLE[ITEM_COUNT].Y = ItemList[k].y;
++ITEM_COUNT;
}
}
for (int l = 0; l < CMD_AREA_COUNT; ++l)
{
switch (CMD_AREA_TABLE[l].Cmd)
{
case ADD_PC_AREA:
{
CheckAreaAllPC(c, CMD_AREA_TABLE[l].ID);
break;
}
case MOVE_PC_AREA:
{
CheckAreaAllPC(c, CMD_AREA_TABLE[l].ID);
RemoveAreaAllPC(c, CMD_AREA_TABLE[l].ID);
break;
}
case REMOVE_PC_AREA:
{
RemoveAllPC(c, CMD_AREA_TABLE[l].ID);
break;
}
case ADD_NPC_AREA:
{
CheckAreaAllNPC(c, CMD_AREA_TABLE[l].ID);
break;
}
case MOVE_NPC_AREA:
{
CheckAreaAllNPC(c, CMD_AREA_TABLE[l].ID);
RemoveAreaAllNPC(c, CMD_AREA_TABLE[l].ID);
break;
}
case REMOVE_NPC_AREA:
{
RemoveAllNPC(c, CMD_AREA_TABLE[l].ID);
break;
}
case ADD_ITEM_AREA:
{
CheckAreaAllItem(c, CMD_AREA_TABLE[l].ID);
break;
}
case CHANGE_IA2_DURATION_ITEM_AREA:
case CHANGE_IA2_LIMIT_ITEM_AREA:
case CHANGE_IA2_ATTR_ITEM_AREA:
case CHANGE_IA2_ID_ITEM_AREA:
case CHANGE_IA2_RESERVED0_ITEM_AREA:
case CHANGE_IA2_RESERVED1_ITEM_AREA:
case ITEM_EXPLOTION_AREA:
{
CommandAllItem(c, CMD_AREA_TABLE[l].ID, CMD_AREA_TABLE[l].Cmd);
break;
}
case REMOVE_ITEM_AREA:
{
RemoveAllItem(c, CMD_AREA_TABLE[l].ID);
break;
}
}
}
CMD_AREA_COUNT = 0;
} //> CSD-CN-031213
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -