bool ChatHandler::HandleGPSCommand(uint8* args) { wowWData data; Object *obj; const uint32 *guid = m_pClient->getCurrentChar()->getSelectionPtr(); if (guid[0] != 0) { if(!(obj = (Object*)WorldServer::getSingleton().GetCreature(guid[0])) && !(obj = (Object*)WorldServer::getSingleton().GetCharacter(guid[0]))) { FillMessageData(&data, 0x09, m_pClient, (uint8*)"You should select a character or a creature."); m_pClient->SendMsg( &data ); return true; } } else obj = (Object*)m_pClient->getCurrentChar(); uint8 buf[256]; sprintf((char*)buf, "X: %f Y: %f Z %f Orientation: %f", obj->getPositionX(), obj->getPositionY(), obj->getPositionZ(), obj->getOrientation()); FillMessageData(&data, 0x09, m_pClient, buf); m_pClient->SendMsg( &data ); return true; }
//UINT32 void ChatHandler::Message(Character * pChar, char * nom, const uint32 Value) { wowWData data; uint8 buf[256]; if(strcmp(pChar->getName(),m_pClient->getCurrentChar()->getName())!=0) { // send message to user sprintf((char*)buf,"You change the %s to %i of %s.", nom, Value, pChar->getName()); FillMessageData(&data, 0x09, m_pClient, buf); m_pClient->SendMsg( &data ); // send message to player sprintf((char*)buf,"%s changed your %s to %i.", m_pClient->getCurrentChar()->getName(), nom, Value); FillMessageData(&data, 0x09, pChar->pClient, buf); pChar->pClient->SendMsg( &data ); } else { // send message to user sprintf((char*)buf,"You change your %s to %i.", nom, Value, pChar->getName()); FillMessageData(&data, 0x09, m_pClient, buf); m_pClient->SendMsg( &data ); } }
void ChatHandler::Message(Character * pChar, char * nom) { wowWData data; uint8 buf[256]; if(strcmp(pChar->getName(),m_pClient->getCurrentChar()->getName())!=0) { // send message to user sprintf((char*)buf,"You %s %s.", nom, pChar->getName()); FillMessageData(&data, 0x09, m_pClient, buf); m_pClient->SendMsg( &data ); // send message to player sprintf((char*)buf,"%s %s you.", m_pClient->getCurrentChar()->getName(), nom); FillMessageData(&data, 0x09, pChar->pClient, buf); pChar->pClient->SendMsg( &data ); } else { // send message to user sprintf((char*)buf,"You %s to you.", nom); FillMessageData(&data, 0x09, m_pClient, buf); m_pClient->SendMsg( &data ); } }
bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, uint8* text) { char *cmd = (char*)text; uint32 AcctLvl = m_pClient->getAccountLvl(); while (*text != ' ' && *text != '\0') text++; // skip command if(*text != '\0') { *text = '\0'; text++; } while (*text == ' ') text++; // skip whitespace if(*cmd == '\0') return false; for(uint32 i = 0; table[i].Name != NULL; i++) { if(!hasStringAbbr(table[i].Name, cmd)) continue; if(AcctLvl < table[i].SecurityLevel) continue; if(table[i].ChildCommands != NULL) { if(!ExecuteCommandInTable(table[i].ChildCommands, text)) { if(table[i].Help != "") SendMultilineMessage(table[i].Help.c_str()); else { wowWData data; FillMessageData(&data, 0x09, m_pClient, (uint8*)"There is no such subcommand."); m_pClient->SendMsg(&data); } } return true; } if(!(this->*(table[i].Handler))(text)) { if(table[i].Help != "") SendMultilineMessage(table[i].Help.c_str()); else { wowWData data; FillMessageData(&data, 0x09, m_pClient, (uint8*)"Incorrect syntax."); m_pClient->SendMsg(&data); } } return true; } return false; }
void ChatHandler::ChangeSelectedNPC(const uint16 &index, const uint32 Value, const uint32 max, const uint32 min) { wowWData data; if(!TestValue(Value, max, min)) return; Unit * pUnit = getSelectedNPC(); if(pUnit!=NULL) { pUnit->setUpdateValue(index , Value); DatabaseInterface *dbi = Database::getSingleton().createDatabaseInterface( ); /* sprintf((char*)buf, "DELETE FROM creatures WHERE id=%u", pUnit->getGUID()); dbi->doQuery((char*)buf); dbi->saveCreature(pUnit); */ dbi->updateCreature(pUnit); Database::getSingleton( ).removeDatabaseInterface(dbi); pUnit->UpdateObject(); FillMessageData(&data, 0x09, m_pClient,(uint8*)"NPC updated."); m_pClient->SendMsg( &data ); } return; }
void ChatHandler::MovePlayer(GameClient *pClient, float x, float y, float z) { wowWData data; //Output new position to the console uint8 txtBuffer[512]; sprintf((char*)txtBuffer,"WORLD: Moved player to (%f, %f, %f)",x,y,z ); Log::getSingleton( ).outString( (char*)txtBuffer ); sprintf((char*)txtBuffer,"You have been moved to (%f, %f, %f)",x,y,z ); FillMessageData(&data, 0x09, pClient, txtBuffer); pClient->SendMsg( &data ); //////////////////////////////////////// //Set the new position of the character Character *chr = pClient->getCurrentChar(); //Send new position to client via MSG_MOVE_TELEPORT_ACK chr->TeleportAck(&data, x,y,z); pClient->SendMsg(&data); ////////////////////////////////// //Now send new position of this player to all clients using MSG_MOVE_HEARTBEAT chr->BuildHeartBeat(&data); world.SendGlobalMessage(&data, pClient); }
bool ChatHandler::HandleSaveAllCommand(uint8* args) { wowWData data; uint8 buf[256]; sprintf((char*)buf,"Characters saved: %i/%i\n", WorldServer::getSingleton().Save(m_pClient->getCharacterName()),WorldServer::getSingleton().GetClientsConnected()); FillMessageData(&data, 0x09, m_pClient, buf); m_pClient->SendMsg( &data ); return true; }
//FLOAT int32 ChatHandler::TestValue(const uint32 Value, const uint32 max, const uint32 min) { if(Value<min || Value>max) { wowWData data; FillMessageData(&data, 0x09, m_pClient,(uint8*)"Invalid Value."); m_pClient->SendMsg( &data ); return 0; } return 1; }
void ChatHandler::SendMultilineMessage(const char *str) { char buf[256]; wowWData data; const char* line = str; const char* pos = line; while((pos = strchr(line, '\n')) != NULL) { strncpy(buf, line, pos-line); buf[pos-line]=0; FillMessageData(&data, 0x09, m_pClient, (uint8*)buf); m_pClient->SendMsg(&data); line = pos+1; } FillMessageData(&data, 0x09, m_pClient, (uint8*)line); m_pClient->SendMsg(&data); }
//START OF LINA COMMAND BY PTR FONCTION PATCH 1.3 Character * ChatHandler::getSelectedChar() { const uint32 *guid; wowWData data; Character *chr=NULL; guid = m_pClient->getCurrentChar()->getSelectionPtr(); if (guid[0] != 0) { if(guid[1]==0) chr= WorldServer::getSingleton().GetCharacter(guid[0]); else { FillMessageData(&data, 0x09, m_pClient,(uint8*) "Please select a User."); m_pClient->SendMsg( &data ); } } else { chr=m_pClient->getCurrentChar(); FillMessageData(&data, 0x09, m_pClient,(uint8*) "AutoSelection."); m_pClient->SendMsg( &data ); } return chr; }
Unit * ChatHandler::getSelectedNPC() { const uint32 *guid; guid = m_pClient->getCurrentChar()->getSelectionPtr(); if (guid[0] != 0) { if(guid[1]==0xF0001000) return WorldServer::getSingleton().GetCreature(guid[0]); } wowWData data; FillMessageData(&data, 0x09, m_pClient,(uint8*) "Please select a NPC"); m_pClient->SendMsg( &data ); return NULL; }
//START OF LINA COMMAND BY NAME FONCTION PATCH Character * ChatHandler::getCurrentCharByName(uint8 * pName) { WorldServer::ClientSet::iterator itr; for (itr = world.mClients.begin(); itr != world.mClients.end(); itr++) { if( strcmp(((GameClient*)(*itr))->getCharacterName(), (char*)pName) == 0 ) { return ((GameClient*)(*itr))->getCurrentChar(); } } wowWData data; uint8 buf[256]; sprintf((char*)buf,"Character (%s) does not exist or is not logged in.", (char*)pName); FillMessageData(&data, 0x09, m_pClient, buf); m_pClient->SendMsg( &data ); return NULL; }
bool ChatHandler::HandleMonsterYellCommand(const char* args, WorldSession *m_session) { Unit* crt = getSelectedUnit(m_session, false); if(!crt) return true; if(crt->IsPlayer()) { WorldPacket * data = FillMessageData(CHAT_MSG_YELL, LANG_UNIVERSAL, args, crt->GetGUID(), 0); crt->SendMessageToSet(data, true); delete data; } else crt->SendChatMessage(CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, args); sWorld.LogGM(m_session, "Used npc yell command on %s %s", crt->IsPlayer() ? "Player" : "Creature", crt->GetName()); return true; }
int ChatHandler::ParseCommands(uint8* text, uint16 text_length) { assert(text); // assert(*text); if(text[0] != '!' && text[0] != '.') // let's not confuse users return 0; text++; if(!ExecuteCommandInTable(LoadHelp(false), text)) { wowWData data; FillMessageData(&data, 0x09, m_pClient, (uint8*)"There is no such command."); m_pClient->SendMsg(&data); } return 1; }
bool ChatHandler::HandleModifyMountCommand(uint8* args) { wowWData data; if(!*args) return false; uint32 mId = 1147; float speed = (float)30; uint32 num = 0; num = atoi((char*)args); switch(num) { case 1: mId=1147; //GRYPHON break; case 2: mId=479; //HYPOGRYPH break; case 3: mId=235; //EVIL HORSE break; case 4: mId=236; //WHITE HORSE break; case 5: mId=237; //PALOMINO HORSE break; case 6: mId=238; //PINTO HORSE break; case 7: mId=239; //BLACK HORSE break; case 8: mId=908; //CHESNUT HORSE break; case 9: mId=1531; //ZEBRA break; case 10: mId=2346; //NIGHTMARE HORSE break; case 11: mId=5050; //UNDEAD STEED break; case 12: mId=2784; //BLACK RAMS break; case 13: mId=2787; //BLUE RAMS break; case 14: mId=2785; //BROWN RAMS break; case 15: mId=2736; //GREY RAMS break; case 16: mId=2786; //WHITE RAMS break; case 17: mId=180; //ORANGE RAPTOR break; case 18: mId=322; //DARK GREEN RAPTOR break; case 19: mId=675; //BLUE RAPTOR break; case 20: mId=787; //YELLOW RAPTOR break; case 21: mId=960; //PURPLE RAPTOR break; case 22: mId=1960; //RED RAPTOR break; case 23: mId=1337; //DARK GREY RAPTOR break; case 24: mId=1041; //BROWN STRIDER break; case 25: mId=1220; //GREY STRIDER break; case 26: mId=1221; //IVORY STRIDER break; case 27: mId=1961; //PING STRIDER break; case 28: mId=1281; //PURPLE STRIDER break; case 29: mId=1040; //TEAL STRIDER break; case 30: mId=321; //BLACK TIGER break; case 31: mId=1056; //BROWN TIGER break; case 32: mId=3029; //DARK TIGER break; case 33: mId=320; //RED TIGER break; case 34: mId=748; //SNOW TIGER break; case 35: mId=616; //WHITE TIGER break; case 36: mId=632; //YELLOW TIGER break; case 37: mId=2187; //STRIPED UNICORN break; case 38: mId=2185; //EVIL UNICORN break; case 39: mId=2186; //IVORY UNICORN break; case 40: mId=2189; //BLAC STRIPES UNICORN break; case 41: mId=207; //DARK BLACK WOLF break; case 42: mId=246; //REDDISH BROWN WOLF break; case 43: mId=247; //BROWN WOLF break; case 44: mId=720; //LIGHT BLUE WOLF break; case 45: mId=2320; //GREY WOLF break; case 46: mId=2327; //DARK GREY WOLF break; case 47: mId=2328; //DARK BROWN WOLF break; case 48: mId=295; //WYVERN break; case 49: mId=6544; //GRAY ROBOT STRIDER break; case 50: mId=6569; //BROWN ROBOT STRIDER break; case 51: mId=6369; //DARK BROWN DRAGON break; case 52: mId=6370; //LIGHT BROWN DRAGON break; case 53: mId=6371; //CHAMPAGNE DRAGON break; case 54: mId=6372; //SNOW DRAGON break; case 55: mId=6373; //BLUE DRAGON break; case 56: mId=6374; //DARK BROWN DRAGON 2 break; case 57: mId=6375; //GREEN DRAGON break; case 58: mId=6376; //CHAMPAGNE DRAGON 2 break; case 59: mId=6377; //DARK BROWN DRAGON 3 break; case 60: mId=6378; //DARK BROWN DRAGON 4 break; case 61: mId=6379; //LIGHT GREEN DRAGON break; case 62: mId=5145; //BLOOD DRAGON break; case 63: mId=1340; //STRIDER break; case 64: mId=1566; //BAT break; default: //NO ERROR OF MOUNT ;) FillMessageData(&data, 0x09, m_pClient, (uint8*)"There is no such mount."); m_pClient->SendMsg( &data ); return true; } Character *pChar=getSelectedChar(); if(pChar) { pChar->setUpdateValue( UNIT_FIELD_FLAGS , 0x001000 ); ChangeSelectedChar(UNIT_FIELD_MOUNTDISPLAYID, mId, 8192, 1, "MOUNT"); pChar->setUpdateValue( UNIT_FIELD_FLAGS , 0x003000 ); ChangeSelectedCharMsg(SMSG_FORCE_SPEED_CHANGE, (float)30, 30, 1, "WALK SPEED"); ChangeSelectedCharMsg(SMSG_FORCE_SWIM_SPEED_CHANGE, (float)30, 30, 1, "WATER SPEED"); } return true; }
void ChatHandler::HandleMsg( wowWData & recv_data, GameClient *pClient ) { wowWData data; char f[256]; sprintf(f, "WORLD: Chat Opcode 0x%.4X", recv_data.opcode); Log::getSingleton( ).outString( f ); switch (recv_data.opcode) { case CMSG_MESSAGECHAT: { uint16 text_length = strlen((char*)recv_data.data+8)+1; m_pClient = pClient; if (ParseCommands(recv_data.data+8, text_length) > 0) return; uint8 text_mode = recv_data.data[0]; FillMessageData( &data, text_mode, pClient, recv_data.data+8 ); if (text_mode != CHAT_MSG_WHISPER) { // whisper message send in FillMessageData pClient->SendMsg( &data ); world.SendGlobalMessage(&data, pClient); } }break; case CMSG_TEXT_EMOTE: { uint32 text_emote, guid1, guid2; recv_data.readData(text_emote); recv_data >> guid1 >> guid2; char *nam=0; uint16 namlen=0; WorldServer::CharacterMap::iterator chariter; WorldServer::CreatureMap::iterator npciter; if( ( npciter = world.mCreatures.find( guid1 ) ) != world.mCreatures.end( ) ) { nam = npciter->second->getCreatureName( ); namlen = strlen( nam ) + 1; } else if( ( chariter = world.mCharacters.find( guid1 ) ) != world.mCharacters.end( ) ) { nam = chariter->second->getName( ); namlen = strlen( nam ) + 1; } data.clear(); data.Initialise(12, SMSG_EMOTE); uint8 emote_anim = world.mEmotes[uint8(text_emote&0xff)]; data << (uint8)emote_anim; data << (uint8)0x00; data << (uint8)0x00; data << (uint8)0x00; uint32 guid = pClient->getCurrentChar()->getGUID(); data << (uint32)guid << (uint8)0x00 << (uint8)0x00 << (uint8)0x00 << (uint8)0x00; world.SendGlobalMessage(&data); data.clear(); data.setLength(12 + namlen); data.opcode = SMSG_TEXT_EMOTE; memcpy(data.data, &guid, 4); data.data[4] = 0x00; data.data[5] = 0x00; data.data[6] = 0x00; data.data[7] = 0x00; memcpy(data.data+8,recv_data.data,4); if( namlen > 0 ) memcpy( data.data + 12, nam, namlen ); pClient->SendMsg( &data ); world.SendGlobalMessage(&data, pClient); } break; } }