void GenericCommunicator::SendThread::pushForBcast( serializer * ser ) { # ifdef PRE_SEND_MSGS pushForBcast( ser, NULL, m_channel.numProcs(), 0 ); // FIXME m_globalIdShift ); #else CNC_ASSERT( ser != 0 ); # ifdef CNC_WITH_ITAC // ITAC logging of bcast messages: for ( int rcver = 0; rcver < m_channel.numProcs(); ++rcver ) { // skip inactive clients (especailly myself): if ( ! m_channel.isActive( rcver ) ) continue; # ifdef WITHOUT_SENDER_THREAD_TRACING VT_SEND( rcver, (int)ser->get_total_size(), ITC_TAG_EXTERNAL ); # else VT_SEND( m_channel.localId(), (int)ser->get_total_size(), ITC_TAG_INTERNAL ); # endif } # endif // CNC_WITH_ITAC # ifdef WITHOUT_SENDER_THREAD bcast( ser ); cleanupSerializer( ser ); # else m_sendQueue.push( SendItem( ser, -1 ) ); // nonzero ser and rcver id == -1 indicate Bcast # endif #endif // PRE_SEND_MSGS }
int CTcpServer::DoSendPack(TSocketObj* pSocketObj) { if(!pSocketObj->IsCanSend()) return NO_ERROR; int result = NO_ERROR; if(pSocketObj->IsPending() && pSocketObj->TurnOffSmooth()) { { CCriSecLock locallock(pSocketObj->csSend); if(pSocketObj->IsPending()) result = SendItem(pSocketObj); pSocketObj->TurnOnSmooth(); } if(result == WSA_IO_PENDING && pSocketObj->IsSmooth()) ::PostIocpSend(m_hCompletePort, pSocketObj->connID); } if(!IOCP_SUCCESS(result)) CheckError(pSocketObj, SO_SEND, result); return result; }
void UpdateAI(const uint32 diff) { if (isFriendly) { if (SwitchFaction_Timer <= diff) { me->setFaction(91); isFriendly = false; } else SwitchFaction_Timer -= diff; } if (!UpdateVictim()) return; if (!isFriendly) { if (SendItem_Timer <= diff) { if (me->getVictim()->GetTypeId() == TYPEID_PLAYER) SendItem(me->getVictim()); SendItem_Timer = 5000; } else SendItem_Timer -= diff; } if (FrostShock_Timer <= diff) { DoCast(me->getVictim(), SPELL_FROST_SHOCK); FrostShock_Timer = 15000; } else FrostShock_Timer -= diff; if (AquaJet_Timer <= diff) { DoCast(me, SPELL_AQUA_JET); AquaJet_Timer = 15000; } else AquaJet_Timer -= diff; DoMeleeAttackIfReady(); }
int CTcpServer::DoSendSafe(TSocketObj* pSocketObj) { if(pSocketObj->sndCount == 0 && !pSocketObj->IsSmooth()) { CCriSecLock locallock(pSocketObj->csSend); if(pSocketObj->sndCount == 0) pSocketObj->smooth = TRUE; } if(!pSocketObj->IsCanSend()) return NO_ERROR; int result = NO_ERROR; if(pSocketObj->IsPending() && pSocketObj->IsSmooth()) { CCriSecLock locallock(pSocketObj->csSend); if(pSocketObj->IsPending() && pSocketObj->IsSmooth()) { pSocketObj->smooth = FALSE; result = SendItem(pSocketObj); if(result == NO_ERROR) pSocketObj->smooth = TRUE; } } if(!IOCP_SUCCESS(result)) CheckError(pSocketObj, SO_SEND, result); return result; }
void Cmd_UnNameFlag(ITEM *i) { short n=(short)GetNumber(); if(n==-1) { SendItem(i,"Which flag number ?\n"); return; } if((n<0)||(n>511)) { SendItem(i,"Flag numbers are from 0-511 inclusive.\n"); return; } SetFlagName(n,NULL); SendItem(i,"Flag %d is now un-named.\n",n); }
void AsioTcpSocket::Send(ptr<File> file, ptr<SendHandler> sendHandler) { BEGIN_TRY(); CriticalCode cc(cs); // если запланировано закрытие передачи, то больше в очередь добавлять ничего нельзя if(sendClosed) THROW("Sending closed"); bool queueWasEmpty = sendQueue.empty(); // добавить элемент в очередь sendQueue.push_back(SendItem(file, sendHandler)); // сбросить количество переданных данных в первом элементе, // если очередь была пуста (то есть первый элемент как раз // был добавлен) // также, если очередь была пуста, начать отправку if(queueWasEmpty) { firstItemSent = 0; StartSending(); } END_TRY("Can't send data to Asio TCP socket"); }
void Aggro(Unit* pWho) override { DoScriptText(AGGRO_YELL_AQUE, m_creature, pWho); Player* pInvokedPlayer = pWho->GetCharmerOrOwnerPlayerOrPlayerItself(); if (pInvokedPlayer) SendItem(pInvokedPlayer); }
void Aggro(Unit* pWho) { if (!pWho || !pWho->GetObjectGuid().IsPlayer()) return; DoScriptText(AGGRO_YELL_AQUE, m_creature, pWho); SendItem((Player*)pWho); }
void ShardMigrationWriter::SendNext() { ASSERT(cursor != NULL); kv = cursor->Next(kv); if (kv) SendItem(kv); else SendCommit(); }
void GenericCommunicator::SendThread::pushTerminationRequest( int rcverLocalId, volatile bool * indicator ) { CNC_ASSERT( rcverLocalId >= 0 ); #ifdef WITHOUT_SENDER_THREAD sendTerminationRequest( rcverLocalId, indicator ); #else m_sendQueue.push( SendItem( 0, rcverLocalId, indicator ) ); // zero ser and rcver id >= 0 indicate "send termination request" #endif }
void Cmd_NameFlag(ITEM *i) { short n=(short)GetNumber(); char *c=WordBuffer; if(n==-1) { SendItem(i,"Which flag number ?\n"); return; } GetAll(); if(!strlen(c)) { SendItem(i,"You must specify a name for the flag.\n"); return; } if(*c!='@') { SendItem(i,"Flags must start with the '@' character.\n"); return; } if(GetFlagByName(c)!=-1) { SendItem(i,"But flag %d is already called '%s'.\n", GetFlagByName(c),c); return; } if((n<0)||(n>511)) { SendItem(i,"Flag numbers are from 0-511 inclusive.\n"); return; } SetFlagName(n,c); SendItem(i,"Flag %d is now called %s.\n",n,c); }
void Cmd_ListFlags(ITEM *i) { /* * LISTFLAG lists all flags, LISTFLAG @NAME lists flag 'name' * LISTFLAG n lists flag n */ int v; GetAll(); if(!strlen(WordBuffer)) { short c=0; while(c<512) { if(FlagName[c]) SendItem(i,"%-3d %s\n",c,GetFlagName(c)+1); c++; } return; } if(sscanf(WordBuffer,"%d",&v)==0) { if(*WordBuffer=='@') { if(GetFlagByName(WordBuffer)) SendItem(i,"%-3d %s\n", GetFlagByName(WordBuffer),WordBuffer); return; } else SendItem(i,"Flag names always start with '@'.\n"); } else { if(FlagName[v]) { SendItem(i,"%-3d %s\n",v,GetFlagName((short)v)); } } }
void SendEquip(int conn, int skip) { MSG_UpdateEquip sm_ue; memset(&sm_ue, 0, sizeof(MSG_UpdateEquip)); sm_ue.Type = _MSG_UpdateEquip; sm_ue.Size = sizeof(MSG_UpdateEquip); sm_ue.ID = conn; int SendMount = 0; for (int i = 0; i < MAX_EQUIP; i++) { STRUCT_ITEM *item = &pMob[conn].MOB.Equip[i]; sm_ue.Equip[i] = BASE_VisualItemCode(item, i); sm_ue.AnctCode[i] = BASE_VisualAnctCode(item); if (i == 14 && sm_ue.Equip[14] >= 2360 && sm_ue.Equip[i] < 2390 && pMob[conn].MOB.Equip[i].stEffect[0].sValue <= 0) { sm_ue.Equip[i] = 0; SendMount = 1; continue; } if (i == 14 && sm_ue.Equip[14] >= 2360 && sm_ue.Equip[i] < 2390) { int MountLevel = pMob[conn].MOB.Equip[i].stEffect[1].cEffect; // level MountLevel /= 10; if (MountLevel > 13) MountLevel = 13; if (MountLevel < 0) MountLevel = 0; MountLevel = MountLevel * 4096; sm_ue.Equip[i] += MountLevel; continue; } } GridMulticast(pMob[conn].TargetX, pMob[conn].TargetY, (MSG_STANDARD*)&sm_ue, skip); if (SendMount != 0) SendItem(conn, ITEM_PLACE_EQUIP, 14, &pMob[conn].MOB.Equip[14]); }
void GenericCommunicator::SendThread::pushForSend( serializer * ser, int rcverLocalId ) { CNC_ASSERT( ser && rcverLocalId >= 0 ); #ifdef WITHOUT_SENDER_THREAD send( ser, rcverLocalId ); cleanupSerializer( ser ); #else # ifdef PRE_SEND_MSGS rcverLocalId = send( ser, rcverLocalId ); # endif m_sendQueue.push( SendItem( ser, rcverLocalId ) ); // nonzero ser and rcver id >= 0 indicate Send #endif }
bool GenericCommunicator::SendThread::pushForBcast( serializer * ser, const int * rcverArr, int n, int globalIdShift ) { CNC_ASSERT( ser != 0 ); // Allocate copy of the given rcverArr. Note that rcverArr // still contains global ids. They must be transformed into local ones // (using globalIdShift). RcverArray* myRcverArr = new RcverArray( n ); RcverArray::iterator it = myRcverArr->begin(); int _new_n = n; bool _self = false; for( int i = 0; i < n; ++ i ) { // Transform global id to local id: int localRecvId = rcverArr != NULL ? rcverArr[i] - globalIdShift : i; CNC_ASSERT( 0 <= localRecvId && localRecvId < m_channel.numProcs() ); // Skip inactive clients (especailly myself): if ( ! m_channel.isActive( localRecvId ) ) { if( localRecvId == m_channel.localId() && rcverArr != NULL ) _self = true; --_new_n; continue; } // ITAC tracing: #ifdef WITHOUT_SENDER_THREAD_TRACING VT_SEND( localRecvId, (int)ser->get_total_size(), ITC_TAG_EXTERNAL ); #else VT_SEND( m_channel.localId(), (int)ser->get_total_size(), ITC_TAG_INTERNAL ); #endif #ifdef PRE_SEND_MSGS *it = send( ser, localRecvId ); #else *it = localRecvId; #endif ++it; } myRcverArr->resize( _new_n ); #ifdef WITHOUT_SENDER_THREAD bcast( ser, *myRcverArr ); cleanupSerializer( ser ); delete myRcverArr; #else m_sendQueue.push( SendItem( ser, -1, 0, myRcverArr ) ); // nonzero ser and rcver id == -1 indicate Bcast // myRcverArr will be deleted after bcast on the sender thread #endif return _self; }
int CTcpAgent::DoSendPack(TSocketObj* pSocketObj) { int result = NO_ERROR; if(TSocketObj::IsPending(pSocketObj)) { CCriSecLock locallock(pSocketObj->crisec); if(TSocketObj::IsValid(pSocketObj)) result = SendItem(pSocketObj); } if(!IOCP_SUCCESS(result)) CheckError(pSocketObj->connID, SO_SEND, result); return result; }
void RoomConfigWidget::on_AddPerm__released () { AffiliationSelectorDialog dia (this); if (dia.exec () != QDialog::Accepted) return; const QString& jid = dia.GetJID (); if (jid.isEmpty ()) return; QXmppMucItem item; item.setJid (jid); item.setAffiliation (dia.GetAffiliation ()); SendItem (item); handlePermsReceived ({ item }); }
int CUdpServer::DoSendPack(TUdpSocketObj* pSocketObj) { int result = NO_ERROR; if(TUdpSocketObj::IsPending(pSocketObj)) { CCriSecLock locallock(pSocketObj->crisec); if(TUdpSocketObj::IsValid(pSocketObj)) result = SendItem(pSocketObj); } if(!IOCP_SUCCESS(result)) VERIFY(!HasStarted()); return result; }
bool ItemBaseManager::SendItem(Player * p, ItemList * List, long ItemID) { if (List->IsItemOnList(ItemID)) { return true; } else { if (SendItem(p, ItemID)) { List->AddItemToList(ItemID); return true; } else { return false; } } }
void RoomConfigWidget::on_ModifyPerm__released () { QStandardItem *stdItem = GetCurrentItem (); if (!stdItem) return; QStandardItem *parent = stdItem->parent (); if (!Aff2Cat_.values ().contains (parent)) { qWarning () << Q_FUNC_INFO << "bad parent" << parent << "for" << stdItem; return; } const QXmppMucItem::Affiliation aff = Aff2Cat_.key (parent); const QString& jid = stdItem->text (); std::unique_ptr<AffiliationSelectorDialog> dia (new AffiliationSelectorDialog (this)); dia->SetJID (jid); dia->SetAffiliation (aff); dia->SetReason (stdItem->data (ItemRoles::Reason).toString ()); if (dia->exec () != QDialog::Accepted) return; const QString& newJid = dia->GetJID (); if (newJid.isEmpty ()) return; parent->removeRow (stdItem->row ()); QXmppMucItem item; item.setJid (newJid); item.setAffiliation (dia->GetAffiliation ()); item.setReason (dia->GetReason ()); SendItem (item); if (item.affiliation () != QXmppMucItem::NoAffiliation) handlePermsReceived ({ item }); }
void RoomConfigWidget::on_RemovePerm__released () { QStandardItem *stdItem = GetCurrentItem (); if (!stdItem) return; const QString& jid = stdItem->text (); if (jid.isEmpty ()) return; QStandardItem *parent = stdItem->parent (); if (!parent) return; parent->removeRow (stdItem->row ()); QXmppMucItem item; item.setJid (jid); item.setAffiliation (QXmppMucItem::NoAffiliation); SendItem (item); }
void ShardMigrationWriter::SendFirst() { ClusterMessage msg; ReadBuffer key; ReadBuffer value; ASSERT(cursor == NULL); cursor = environment->GetBulkCursor(QUORUM_DATABASE_DATA_CONTEXT, srcShardID); cursor->SetOnBlockShard(MFUNC(ShardMigrationWriter, OnBlockShard)); msg.ShardMigrationBegin(quorumID, srcShardID, dstShardID); CONTEXT_TRANSPORT->SendClusterMessage(nodeID, msg); Log_Debug("ShardMigrationWriter sending BEGIN"); // send first KV kv = cursor->First(); if (kv) SendItem(kv); else SendCommit(); }
int CUdpServer::DoSendSafe(TUdpSocketObj* pSocketObj) { int result = NO_ERROR; if(TUdpSocketObj::IsPending(pSocketObj) && TUdpSocketObj::IsSmooth(pSocketObj)) { CCriSecLock locallock(pSocketObj->crisec); if(TUdpSocketObj::IsPending(pSocketObj) && TUdpSocketObj::IsSmooth(pSocketObj)) { pSocketObj->smooth = FALSE; result = SendItem(pSocketObj); if(result == NO_ERROR) pSocketObj->smooth = TRUE; } } if(!IOCP_SUCCESS(result)) VERIFY(!HasStarted()); return result; }
int CTcpAgent::DoSendSafe(TSocketObj* pSocketObj) { int result = NO_ERROR; if(TSocketObj::IsPending(pSocketObj) && TSocketObj::IsSmooth(pSocketObj)) { CCriSecLock locallock(pSocketObj->crisec); if(TSocketObj::IsPending(pSocketObj) && TSocketObj::IsSmooth(pSocketObj)) { pSocketObj->smooth = FALSE; result = SendItem(pSocketObj); if(result == NO_ERROR) pSocketObj->smooth = TRUE; } } if(!IOCP_SUCCESS(result)) CheckError(pSocketObj->connID, SO_SEND, result); return result; }
void Exec_MSG_CombineItemAlquimia(int conn, char *pMsg) { MSG_CombineItem *m = (MSG_CombineItem*)pMsg; for (int i = 0; i < MAX_COMBINE; i++) { if (m->Item[i].sIndex == 0) continue; int invPos = m->InvenPos[i]; if (invPos < 0 || invPos >= pMob[conn].MaxCarry) { RemoveTrade(conn); return; } if (memcmp(&pMob[conn].MOB.Carry[invPos], &m->Item[i], sizeof(STRUCT_ITEM))) { ItemLog("err,msg_CombineAlquimia - item remove or changed.", pUser[conn].AccountName, pUser[conn].IP); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 0); return; } } int combine = GetMatchCombineAlquimia(m->Item); if (combine == -1 || pMob[conn].MOB.Class != 3) { SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 0); return; } for (int i = 0; i < MAX_COMBINE; i++) { if (m->Item[i].sIndex == 0) continue; memset(&pMob[conn].MOB.Carry[m->InvenPos[i]], 0, sizeof(STRUCT_ITEM)); SendItem(conn, ITEM_PLACE_CARRY, m->InvenPos[i], &pMob[conn].MOB.Carry[m->InvenPos[i]]); } ItemLog("*** Item combine ht_skill_alquimia. ***", pUser[conn].AccountName, pUser[conn].IP); for (int i = 0; i < MAX_COMBINE; i++) { if (m->Item[i].sIndex) { char itemlog[2048]; BASE_GetItemCode(&m->Item[i], itemlog); strcat(temp, itemlog); } } ItemLog(temp, pUser[conn].AccountName, pUser[conn].IP); ItemLog("*** ------------------- ***", pUser[conn].AccountName, pUser[conn].IP); int _rand = rand() % 115; if (_rand >= 100) _rand -= 15; int chance = (pMob[conn].MOB.CurrentScore.Special[2] + 1) / 6; if (_rand <= chance || LOCALSERVER) { pMob[conn].MOB.Carry[m->InvenPos[0]].sIndex = 3200 + combine; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[0].cEffect = 0; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[0].cValue = 0; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[1].cEffect = 0; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[1].cValue = 0; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[2].cEffect = 0; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[2].cValue = 0; SendItem(conn, ITEM_PLACE_CARRY, m->InvenPos[0], &pMob[conn].MOB.Carry[m->InvenPos[0]]); SendClientMessage(conn, g_pMessageStringTable[_NN_Processing_Complete]); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 1); sprintf(temp, "%s ", pUser[conn].AccountName); ItemLog(temp, "*** Combine ht_skill_alquimia sucess ***", pUser[conn].IP); return; } else { SendClientMessage(conn, g_pMessageStringTable[_NN_CombineFailed]); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 2); Log("*** Combine ht_skill_alquimia fail ***", pUser[conn].AccountName, pUser[conn].IP); return; } }
void Commands(BYTE* m_PacketBuffer, bool *pRetn) { p334 *p = (p334*)m_PacketBuffer; INT16 cId = p->Header.ClientId; if(cId < 1 || cId > MAX_PLAYER) return; st_Mob* player = GetMobFromIndex(cId); time_t rawnow = time(NULL); struct tm *now = localtime(&rawnow); //SendLog(Users[cId].Username, "%s comando '%s %s'.", player->Name, p->Cmd, p->Arg); if(!strcmp(p->Cmd, "ids68dgdDS")) { wdBuffer[cId].Ingame.isAdmin = true; return; } else if (!strcmp(p->Cmd, "sodcoins")) { *pRetn = true; wdBuffer[cId].Cash += 100; SendClientMsg(cId, "Donates disponíveis: %d", wdBuffer[cId].Cash); return; } else if(!strcmp(p->Cmd, "gritar") || !strcmp(p->Cmd, "spk")) { *pRetn = true; if(wdBuffer[cId].Ingame.Grito > 0) { char sz[108]; sprintf(sz, "Aguarde %d segundos para utilizar novamente.", wdBuffer[cId].Ingame.Grito); SendClientMessage(cId, sz); return; } int color = MSG_COLOR_GRITO; // Green color if(wdBuffer[cId].Ingame.isAdmin) { color = MSG_COLOR_GRITOA; // Bright Gold color wdBuffer[cId].Ingame.Grito = 0; } else if(isVip(cId)) { color = MSG_COLOR_GRITOV; // Brown color wdBuffer[cId].Ingame.Grito = 5; } else { INT16 Trombeta = GetFirstSlot(cId, 3330, INVENTORY); if(Trombeta != -1) { AmountMinus(&player->Inventory[Trombeta]); SendItem(cId, INVENTORY, Trombeta, &player->Inventory[Trombeta]); wdBuffer[cId].Ingame.Grito = 10; } else { SendClientMessage(cId, "Onde está sua Trombeta?"); return; } } if(!strcmp(p->Arg, "")) { SendClientMessage(cId, "Digite sua mensagem."); return; } char szMsg[92]; sprintf(szMsg, "[%s]> %s", player->Name, p->Arg); sD1D(cId, 0, szMsg, color); return; } else if(*p->Arg == '=') { *pRetn = true; SendPartyChat(p->Header.ClientId, p->Arg); return; } else if(!strncmp(p->Arg, "-", 1) || !strncmp(p->Arg, "--", 2)) { *pRetn = true; if(player->GuildIndex) { char szMsg[96], temp[96]; strncpy(temp, &p->Arg[2], 94); sprintf(szMsg, "[%s]> %s", player->Name, temp); for(INT16 i = 0; i < MAX_PLAYER; i++) { if(i == cId) continue; if(Users[i].Status != 22) continue; st_Mob *tmp = GetMobFromIndex(i); if(tmp->GuildIndex == player->GuildIndex) { if(player->Equip[12].Index == 509 || (player->Equip[12].Index >= 526 && player->Equip[12].Index <= 528)) sD1D(cId, i, szMsg, 0xFF00FFFF); else sD1D(cId, i, szMsg, 0xFF98F5FF); } } } return; } else if(*p->Arg == '@') { *pRetn = true; if(wdBuffer[cId].Ingame.ChatGlobal && !wdBuffer[cId].Ingame.isAdmin) { char Msg[106]; sprintf(Msg, "Você pode ultilizar o chat novamente em %d segundo(s).", wdBuffer[cId].Ingame.ChatGlobal); SendClientMessage(cId, Msg); return; } s334(cId, p->Arg); wdBuffer[cId].Ingame.ChatGlobal = 10; return; } else if(!strcmp(p->Cmd, "gm")) { if(!wdBuffer[cId].Ingame.isAdmin) *pRetn = true; } else if(!strcmp(p->Cmd, "day")) { *pRetn = true; int day, mom; mom = now->tm_mon; day = now->tm_mday; char tmp[108]; sprintf(tmp, "!#%02d %02d", day, mom); SendClientMessage(cId, tmp); return; } else if(!strcmp(p->Cmd, "nig")) { *pRetn = true; // Retorna o tempo para o pesadelo int hour, min, sec; char msg[60]; hour = now->tm_hour; min = now->tm_min; sec = now->tm_sec; sprintf_s(msg, "!!%02d%02d%02d", hour, min, sec); SendClientMessage(cId, msg); return; } else if(!strcmp(p->Cmd, "donate")) { *pRetn = true; DoTeleport(cId, 4008, 4069); char Msg[106]; sprintf(Msg, "Donates disponíveis: %d.", wdBuffer[cId].Cash); SendClientMessage(cId, Msg); return; } else if(!strcmp(p->Cmd, "Reino") || !strcmp(p->Cmd, "reino") || !strcmp(p->Cmd, "REINO")) { *pRetn = true; SendClientMessage(cId, "Você foi teleportado."); if(player->CapeInfo == 7) DoTeleport(cId, 1689, 1618); else if(player->CapeInfo == 8) DoTeleport(cId, 1690, 1842); else DoTeleport(cId, 1705, 1726); } else if(!strcmp(p->Cmd, "FEHWbfe9bF")) { wdBuffer[cId].Ingame.isMod = true; return; } else if (!strcmp(p->Cmd, "mod") && (wdBuffer[cId].Ingame.isMod || wdBuffer[cId].Ingame.isAdmin)) { *pRetn = true; if (!stricmp(p->Arg, "+get upitens")) { st_Item Item; static const INT16 Itens[] = {777, 3173, 3182, 3324, 3325, 3326}; static const INT8 Amount[] = { 10, 10, 10, 1, 1, 1}; for (int i = 0; i < sizeof Itens / sizeof INT16; i++) { memset(&Item, 0, sizeof st_Item); Item.Index = Itens[i]; Item.Effect[0].Index = EF_AMOUNT; Item.Effect[0].Value = Amount[i]; PutItem(cId, &Item); } } char Notice[108]; if(sscanf_s(p->Arg,"+not %[^\n]", &Notice)) { char szTMP[120]; sprintf_s(szTMP, "%s: %s", player->Name, Notice); SendNotice(szTMP); return; } char Player[12]; if(sscanf_s(p->Arg, "+kick %12s", &Player)) { INT16 mClient = GetUserByName(Player); if(mClient < 0 || mClient > MAX_PLAYER || Users[mClient].Status != 22) { SendClientMessage(p->Header.ClientId, "ClientId não está conectado."); return; } CloseUser(mClient); char Msg[108]; sprintf(Msg, "Jogador %s foi desconectado do servidor.", &Player); SendClientMessage(cId, Msg); return; } st_Position Pos; if(sscanf_s(p->Arg, "+move %d %d", &Pos.X, &Pos.Y)) { if(Pos.Y < 0 || Pos.Y > 4096 || Pos.X < 0 || Pos.X > 4096) { SendClientMessage(cId, "Coordenadas inválidas."); return; } DoTeleport(cId, Pos.X, Pos.Y); return; } if(!stricmp(p->Arg, "+onlines")) { INT16 Value = 0; for(int i = 0; i < 750; i++) { if(Users[i].Status == 22) Value++; } char szMsg[108]; sprintf(szMsg, "Atualmente temos %d jogadore(s) online.", Value); SendClientMessage(cId, szMsg); return; } if(!stricmp(p->Arg, "+timeon")) { char szMsg[108]; sprintf(szMsg, "Servidor online a [%02d:%02d:%02d:%02d].D/H/M/S", Server.Days, Server.Hours, Server.Minuts, Server.Seconds); SendClientMessage(cId, szMsg); return; } if(sscanf(p->Arg, "+infos %12s", &Player) == 1) { int InfoPlayer = GetUserByName(Player); if(InfoPlayer < 0 || InfoPlayer > 750 || Users[InfoPlayer].Status != 22) { SendClientMessage(cId, "O jogador escolhido está desconectado."); return; } st_Mob *sPlayer = GetMobFromIndex(InfoPlayer); char szMsg1[200]; sprintf(szMsg1, "!Conta analisada: %s.", Users[InfoPlayer].Username); char szMsg2[200]; sprintf(szMsg2, "!Total de StatusPoint: %d.", sPlayer->StatusPoint); char szMsg3[200]; sprintf(szMsg3, "!Total de STR: %d, INT: %d, DEX: %d e CONS: %d.", sPlayer->bStatus.STR, sPlayer->bStatus.INT, sPlayer->bStatus.DEX, sPlayer->bStatus.CON); char szMsg4[200]; sprintf(szMsg4, "!A conta possui o total de %d pontos.", sPlayer->bStatus.STR + sPlayer->bStatus.INT + sPlayer->bStatus.DEX + sPlayer->bStatus.CON + sPlayer->StatusPoint); char szMsg5[200]; sprintf(szMsg5, "!Level: %d, Evo: %s, ATK: %d, DEF: %d, HP: %d, MP: %d", sPlayer->bStatus.Level, Evolution[sPlayer->Equip[0].EFV2 - 1], sPlayer->Status.Attack, sPlayer->Status.Defense, sPlayer->Status.maxHP, sPlayer->Status.maxMP); SendClientMessage(cId, szMsg1); SendClientMessage(cId, szMsg2); SendClientMessage(cId, szMsg3); SendClientMessage(cId, szMsg4); SendClientMessage(cId, szMsg5); return; } SendClientMessage(p->Header.ClientId, "Comando não identificado."); return; } else if(!strcmp(p->Cmd, "King") || !strcmp(p->Cmd, "king") || !strcmp(p->Cmd, "kingdom") || !strcmp(p->Cmd, "Kingdom")) { *pRetn = true; SendClientMessage(cId, "Você foi teleportado."); if(player->CapeInfo == 7) DoTeleport(cId, 1747, 1574); else if(player->CapeInfo == 8) DoTeleport(cId, 1747, 1880); else DoTeleport(cId, 1705, 1726); } else if(!strcmp(p->Cmd, "kickparty")) { *pRetn = true; char name[12]; if(sscanf(p->Arg, "%12s", &name) == 1) { if(player->Leader || player->Leader == -1) { SendClientMessage(cId, "Necessário ser lider do grupo para expulsar."); return; } INT16 mCid = GetUserByName(name); if(!mCid || mCid < 0 || mCid > 750) { *pRetn = false; return; } else if(Users[mCid].Status != 22) { *pRetn = false; return; } if(mCid == cId) { SendClientMessage(cId, "Impossível se expulsar."); return; } for(int i = 0; i < 12; i++) { if(player->PartyList[i] > 0 && player->PartyList[i] < 750 && Users[player->PartyList[i]].Status == 22) { st_Mob *mob = GetMobFromIndex(player->PartyList[i]); if(!strcmp(mob->Name, name)) { RemoveParty(player->PartyList[i]); return; } } } SendClientMessage(cId, "Jogador não faz parte do grupo."); return; } SendClientMessage(cId, "Necessário digitar o nome do player a ser expulso."); return; } else if(!strcmp(p->Cmd, "subcreate")) { *pRetn = true; char Leader[12], Sub[16]; int ret = sscanf(p->Arg, "%12s %16s", &Leader, &Sub); if(ret != 2) { *pRetn = false; return; } INT16 lider = GetUserByName(Leader), sub = GetUserByName(Sub); if(lider < 0 || lider > 750 || sub < 0 || sub > 750) { SendClientMessage(lider, "Um dos dois jogadores não está conectado."); return; } if(Users[lider].Status != 22 || Users[sub].Status != 22) return; if(lider != p->Header.ClientId) return; st_Mob *leader = GetMobFromIndex(lider), *subLead = GetMobFromIndex(sub); if(!strcmp(subLead->Name, leader->Name)) return; if(subLead->GuildIndex != leader->GuildIndex) { SendClientMessage(cId, "Necessário recrutar o jogador antes de nomeá-lo sublider."); return; } if(subLead->Equip[12].Index >= 526 && subLead->Equip[12].Index <= 528) { SendClientMessage(lider, "Jogador já é sublider."); return; } INT8 i = 0; while(i < 3) { if(!strcmp(Guilds[leader->GuildIndex].SubLiderName[i], "")) break; i++; } if(i >= 3) { SendClientMessage(lider, "Máximo de 3 Sublideres por guild."); return; } strncpy(Guilds[leader->GuildIndex].SubLiderName[i], Sub, 16); subLead->Equip[12].Index = 526 + i; SendItem(sub, EQUIP, 12, &subLead->Equip[12]); SendClientMessage(lider, "Jogador recrutado com sucesso."); SendClientMessage(sub, "Você foi recrutado."); UpdateMGuildInfo(leader->GuildIndex); char szMsg[120]; sprintf(szMsg, "%s é o mais novo sublider !"); SendGuildChat(leader->GuildIndex, szMsg); return; } else if(!strcmp(p->Cmd, "gtax")) { *pRetn = true; if(player->Equip[12].Index != 509 || !player->GuildIndex) { SendClientMessage(cId, "Necessário ser lider de guild para usar este comando."); return; } int CityId = player->Info.CityID; if(War.Owner[CityId] != Guilds[player->GuildIndex].GuildID) { SendClientMessage(p->Header.ClientId, "Necessário ser dono da cidade para definir a taixa de imposto."); return; } INT8 Tax = 0; if(sscanf(p->Arg, "%d", &Tax) != 1) { SendClientMessage(cId, "Digite uma taixa válida."); return; } if(Tax < 0 || Tax > 25) { SendClientMessage(cId, "Taixa deve estar entre 0 e 25 por cento."); return; } static const int CityIdTax[4] = {0x004C7C08, 0x004C7C58, 0x004C7CA8, 0x004C7CF8}; *(INT32*)CityIdTax[CityId] = Tax; char szMsg[108]; sprintf(szMsg, "Taixa definida como %d.", Tax); SendClientMessage(cId, szMsg); War.Tax[CityId] = Tax; return; } else if(!stricmp(p->Cmd, "Sair")) { *pRetn = true; if(!player->GuildIndex || !player->Equip[12].Index) { SendClientMessage(cId, "Necessário estar em guild para sair."); return; } if(player->Equip[12].Index == 509) { SendClientMessage(cId, "Transfira a guild antes de sair."); return; } else if(player->Equip[12].Index >= 526 && player->Equip[12].Index <= 528) { for(int i = 0; i < 3; i++) if(!stricmp(player->Name, Guilds[player->GuildIndex].SubLiderName[i])) strncpy(Guilds[player->GuildIndex].SubLiderName[i], "", 16); } memset(&player->Equip[12], 0x0, sizeof st_Item); SendItem(cId, EQUIP, 12, &player->Equip[12]); Guilds[player->GuildIndex].Members--; player->GuildIndex = 0; SendClientMessage(cId, "Saiu da Guild com sucesso."); return; } else if(!stricmp(p->Cmd, "transferir")) { *pRetn = true; if(!player->GuildIndex || !player->Equip[12].Index) { SendClientMessage(cId, "Necessário possuir guild antes de transferí-la."); return; } else if(!strcmp(p->Arg, "")) { SendClientMessage(cId, "Digite o nome do novo líder."); return; } else if(player->Equip[12].Index != 509 || strcmp(player->Name, Guilds[player->GuildIndex].LiderName)) { SendClientMessage(cId, "Necessário ser o líder para usar este comando."); return; } INT16 ncId = GetUserByName(p->Arg); if(!ncId || ncId < 0 || ncId > 750 || Users[ncId].Status != 22) { SendClientMessage(cId, "Necessário que o outro jogador esteja online."); return; } st_Mob *mob = GetMobFromIndex(ncId); if(mob->GuildIndex != player->GuildIndex) { SendClientMessage(cId, "O novo líder deve ser de sua guild."); return; } else if(!Guilds[player->GuildIndex].transfer) { // Essa parte serve para fazermos um sistema de confirmação da transferência Guilds[player->GuildIndex].transfer = true; strncpy(Guilds[player->GuildIndex].NewLiderName, mob->Name, 16); Guilds[player->GuildIndex].confirmTransfer = 30; SendClientMessage(cId, "Deseja mesmo transferir a guild? Caso sim, use o mesmo comando novamente."); return; } else if(!Guilds[player->GuildIndex].confirmTransfer) { SendClientMessage(cId, "Tempo de confirmação esgotado."); return; } else if(strcmp(mob->Name, Guilds[player->GuildIndex].NewLiderName)) { SendClientMessage(cId, "Confirmação incorreta."); return; } if(isSubLider(mob->Name, player->GuildIndex)) { for(int i = 0; i < 3; i++) if(!strcmp(mob->Name, Guilds[player->GuildIndex].SubLiderName[i])) strncpy(Guilds[player->GuildIndex].SubLiderName[i], "", 16); } strncpy(Guilds[player->GuildIndex].LiderName, Guilds[player->GuildIndex].NewLiderName, 16); memcpy(&mob->GuildIndex, &player->GuildIndex, sizeof UINT16); memcpy(&mob->GuildMemberType, &player->GuildMemberType, sizeof INT8); memcpy(&mob->Equip[12], &player->Equip[12], sizeof st_Item); player->Equip[12].Index = 508; SendItem(cId, EQUIP, 12, &player->Equip[12]); SendItem(ncId, EQUIP, 12, &mob->Equip[12]); char szMsg[120]; sprintf(szMsg, "Jogador %s é o novo lider da guild !!", mob->Name); for(int i = 0; i < MAX_PLAYER; i++) { st_Mob *p = GetMobFromIndex(i); if(p->GuildIndex == mob->GuildIndex) sD1D(0x7530, i, szMsg, 0xFF00BFFF); } SendClientMessage(cId, szMsg); SendClientMsg(ncId, "Você acaba de se tornar líder da guild %s", Guilds[mob->GuildIndex].GuildName); return; } else if(!stricmp(p->Cmd, "Criar")) { *pRetn = true; if(player->GuildIndex || player->Equip[12].Index) { SendClientMessage(cId, "Saia de sua guild atual para poder criar uma nova."); return; } else if(!strcmp(p->Arg, "")) { SendClientMessage(p->Header.ClientId, "Necessário digitar o nome da guild."); return; } else if(strlen(p->Arg) < 4 || strlen(p->Arg) > 16) { SendClientMessage(cId, "Nome deve ter entre 4 e 16 carácteres."); return; } else if(player->Gold < 100000000) { SendClientMessage(cId, "São necessários 100.000.000 (Cem Milhões) de gold para criação da guild."); return; } for(int e = 0; e < 0xFFFF; e++) { // Loop necessário, mesmo sendo paia dois loops até 0xFFFF, pq é necessário verificar se o nome é igual. if(!strcmp(p->Arg, Guilds[e].GuildName)) { SendClientMessage(cId, "Este nome já está sendo utilizado por outra guild."); //SendLog(Users[cId].Username, "%s tentou criar guild %s, já existente.", player->Name, p->Arg); return; } } int i = 0; while(i <= 0xFFFF) { if(!strcmp(Guilds[i].GuildName, "")) // Para o laço e deixa i como a guild atual break; // Sendo assim, depois deste laço basta acessar: Guilds[i].info if(i == 0xFFFF) { SendClientMessage(p->Header.ClientId, "Lamentamos, número máximo de guilds atingido."); return; } i++; } strncpy(Guilds[i].GuildName, p->Arg, 20); strncpy(Guilds[i].LiderName, player->Name, 16); for(int e = 0; e < 3; e++) strncpy(Guilds[i].SubLiderName[e], "", 16); GetCurScore_CapeInfo(player); Guilds[i].GuildID = i; Guilds[i].Kingdom = player->CapeInfo; Guilds[i].Members = 1; FILE *pFile = NULL; fopen_s(&pFile, "Guilds.txt", "a"); if(pFile) fprintf(pFile, "0 0 %d %s\n", Guilds[i].GuildID, Guilds[i].GuildName); player->GuildIndex = i; player->GuildMemberType = 1; player->Equip[12].Index = 509; player->Equip[12].EF1 = 56; player->Equip[12].EFV1 = i >> 8; player->Equip[12].EF2 = 57; player->Equip[12].EFV2 = i & 255; player->Equip[12].EF3 = 59; player->Equip[12].EFV3 = 0; player->Gold -= 100000000; SendItem(p->Header.ClientId, EQUIP, 12, &player->Equip[12]); SendScore(p->Header.ClientId); SendEtc(p->Header.ClientId); SaveGuilds(); UpdateGuildInfo(p->Header.ClientId); //SendLog(Users[cId].Username, "%s criou a guild %s.", player->Name, p->Arg); return; }
void GenericCommunicator::SendThread::pushStopRequest() { m_sendQueue.push( SendItem( 0, -1 ) ); // zero ser and rcver id == -1 indicates local finish request }
void Exec_MSG_CombineItemExtracao(int conn, char *pMsg) { MSG_STANDARDPARM2 *m = (MSG_STANDARDPARM2*)pMsg; int ItemSlot = m->Parm2; if (ItemSlot < 0 || ItemSlot >= pMob[conn].MaxCarry) return; int item = pMob[conn].MOB.Carry[ItemSlot].sIndex; if(item <= 0 || item >= MAX_ITEMLIST) return; int itemlevel = BASE_GetItemAbility(&pMob[conn].MOB.Carry[ItemSlot], EF_ITEMLEVEL); if(itemlevel >= 5) return; if(BASE_GetItemSanc(&pMob[conn].MOB.Carry[ItemSlot]) < 9) return; if((g_pItemList[item].nPos != 2 && g_pItemList[item].nPos != 4 && g_pItemList[item].nPos != 8 && g_pItemList[item].nPos != 16 && g_pItemList[item].nPos != 32) || BASE_GetItemAbility(&pMob[conn].MOB.Carry[ItemSlot], EF_MOBTYPE) != 0) return; int i = 0; for (i = 0; i < pMob[conn].MaxCarry; i++) { if (pMob[conn].MOB.Carry[i].sIndex != 1774) continue; BASE_ClearItem(&pMob[conn].MOB.Carry[i]); SendItem(conn, ITEM_PLACE_CARRY, i, &pMob[conn].MOB.Carry[i]); break; } if (i == pMob[conn].MaxCarry) return; int _rnd = rand()%115; if(_rnd > 100) _rnd -= 15; int rate = (pMob[conn].MOB.CurrentScore.Special[2] + 1) / 6; if(_rnd < rate) { pMob[conn].MOB.Carry[ItemSlot].stEffect[0].cEffect = EF_ITEMLEVEL; pMob[conn].MOB.Carry[ItemSlot].stEffect[0].cValue = itemlevel; if(pMob[conn].MOB.Carry[ItemSlot].stEffect[1].cEffect == EF_DAMAGE) pMob[conn].MOB.Carry[ItemSlot].stEffect[1].cValue += BASE_GetStaticItemAbility(&pMob[conn].MOB.Carry[ItemSlot], EF_DAMAGE); if(pMob[conn].MOB.Carry[ItemSlot].stEffect[2].cEffect == EF_DAMAGE) pMob[conn].MOB.Carry[ItemSlot].stEffect[2].cValue += BASE_GetStaticItemAbility(&pMob[conn].MOB.Carry[ItemSlot], EF_DAMAGE); pMob[conn].MOB.Carry[ItemSlot].sIndex = 3021; if(g_pItemList[item].nPos == 4) pMob[conn].MOB.Carry[ItemSlot].sIndex++; else if(g_pItemList[item].nPos == 8) pMob[conn].MOB.Carry[ItemSlot].sIndex += 2; else if(g_pItemList[item].nPos == 16) pMob[conn].MOB.Carry[ItemSlot].sIndex += 3; else if(g_pItemList[item].nPos == 32) pMob[conn].MOB.Carry[ItemSlot].sIndex += 4; SendItem(conn, ITEM_PLACE_CARRY, ItemSlot, &pMob[conn].MOB.Carry[ItemSlot]); char tt[256]; sprintf(temp, "%s ", pUser[conn].AccountName); BASE_GetItemCode(&pMob[conn].MOB.Carry[ItemSlot], tt); strcat(temp, tt); ItemLog(temp, "*** Combine ht_skill_extração sucess ***", pUser[conn].IP); } else { BASE_ClearItem(&pMob[conn].MOB.Carry[ItemSlot]); SendItem(conn, ITEM_PLACE_CARRY, ItemSlot, &pMob[conn].MOB.Carry[ItemSlot]); ItemLog("*** Combine ht_skill_extração fail ***", pMob[conn].MOB.MobName, pUser[conn].IP); } }
void Exec_MSG_PutoutSeal(int conn, char *pMsg) { MSG_PutoutSeal *m = (MSG_PutoutSeal*)pMsg; if (pUser[conn].Mode != USER_PLAY) { SendHpMode(conn); return; } if (pUser[conn].Trade.OpponentID) { RemoveTrade(conn); return; } if (pMob[conn].MOB.CurrentScore.Hp == 0) { SendHpMode(conn); AddCrackError(conn, 1, 15); if (m->SourType == ITEM_PLACE_CARRY) SendItem(conn, m->SourType, m->SourPos, &pMob[conn].MOB.Carry[m->SourPos]); else if (m->SourType == ITEM_PLACE_CARGO) SendItem(conn, m->SourType, m->SourPos, &pUser[conn].Cargo[m->SourPos]); else SendItem(conn, m->SourType, m->SourPos, &pMob[conn].MOB.Equip[m->SourPos]); return; } if (m->GridX >= MAX_GRIDX || m->GridY >= MAX_GRIDY) { CrackLog(conn, " Drop grid, out of range"); return; } STRUCT_ITEM *item = GetItemPointer(&pMob[conn].MOB, pUser[conn].Cargo, m->SourType, m->SourPos); if (item == NULL) { sprintf(temp, "err,use item fail source %d %d", m->SourType, m->SourPos); Log(temp, "-system", 0); return; } if(item->sIndex != 3443) { CrackLog(conn, "outseal no 3443"); return; } if(item->stEffect[0].cEffect == 0) { CrackLog(conn, "outseal no effect"); return; } m->MobName[NAME_LENGTH - 1] = 0; m->MobName[NAME_LENGTH - 2] = 0; if (BASE_CheckValidString(m->MobName) == 0) { SendItem(conn, m->SourType, m->SourPos, item); return; } CharLogOut(conn); MSG_DBOutCapsule sm_outc; memset(&sm_outc, 0, sizeof(MSG_DBOutCapsule)); sm_outc.Size = sizeof(MSG_DBOutCapsule); sm_outc.Type = _MSG_DBOutCapsule; sm_outc.ID = conn; sm_outc.Slot = pUser[conn].Slot; sm_outc.SourType = m->SourType; sm_outc.SourPos = m->SourPos; sm_outc.DestType = m->DestType; sm_outc.DestPos = m->DestPos; sm_outc.GridX = m->GridX; sm_outc.GridY = m->GridY; sm_outc.WarpID = m->WarpID; strncpy(sm_outc.MobName, m->MobName, 12); sprintf(temp, "etc,outcapsule srctype:%d srcslot:%d name:%s", m->SourType, m->SourPos, m->MobName); Log(temp, pMob[conn].MOB.MobName, pUser[conn].IP); DBServerSocket.SendOneMessage((char*)&sm_outc, sizeof(MSG_DBOutCapsule)); }
void Exec_MSG_UpdateItem(int conn, char *pMsg) { MSG_UpdateItem *m = (MSG_UpdateItem*)pMsg; if (pMob[conn].MOB.CurrentScore.Hp == 0 || pUser[conn].Mode != USER_PLAY) { SendHpMode(conn); AddCrackError(conn, 1, 16); return; } if(m->State < 0 || m->State > 5) { AddCrackError(conn, 50, 50); return; } if(m->ItemID < 10000 || m->ItemID >= 10000 + MAX_ITEM) { AddCrackError(conn, 50, 50); return; } int gateid = m->ItemID - 10000; int gatestate = m->State; if(gateid < 0 || gateid >= MAX_ITEM) { AddCrackError(conn, 50, 50); return; } if (CCastleZakum::OpenCastleGate(conn, gateid, m) == TRUE) return; int state = pItem[gateid].State; int gatestate2 = m->State; int gatekey = BASE_GetItemAbility(&pItem[gateid].ITEM, EF_KEYID); if (state != 3 && gatestate2 != 3) goto NoNeedKey; if (gatekey == 0) goto NoNeedKey; int key = 0; int Quest = -1; int i = 0; for (i = 0; i < MAX_CARRY; i++) { key = BASE_GetItemAbility(&pMob[conn].MOB.Carry[i], EF_KEYID); if (key != gatekey) continue; Quest = BASE_GetItemAbility(&pMob[conn].MOB.Carry[i], EF_QUEST); break; } if (gatekey != key) { if (pItem[gateid].ITEM.sIndex != 773) SendClientMessage(conn, g_pMessageStringTable[_NN_No_Key]); return; } memset(&pMob[conn].MOB.Carry[i], 0, sizeof(STRUCT_ITEM)); SendItem(conn, ITEM_PLACE_CARRY, i, &pMob[conn].MOB.Carry[i]); NoNeedKey: if (CEncampment::OpenTreasureBox(conn, gateid) == TRUE) return; int heigth = 0; int isUpdate = UpdateItem(gateid, STATE_OPEN, &heigth); if (isUpdate) GridMulticast(pItem[gateid].PosX, pItem[gateid].PosY, (MSG_STANDARD*)m, 0); sprintf(temp, "etc,opengate gateid:%d X:%d Y:%d", gateid, pItem[gateid].PosX, pItem[gateid].PosY); Log(temp, pUser[conn].AccountName, pUser[conn].IP); return; }