//move selected object static bool HandleGameObjectMoveCommand(ChatHandler* handler, char const* args) { uint32 guidLow = GetGuidLowFromArgsOrLastTargetedGo(handler, args); if (!guidLow) return false; GameObject* object = NULL; // by DB guid if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow)) object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id); if (!object) { handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, guidLow); handler->SetSentErrorMessage(true); return false; } char* toX = strtok(NULL, " "); char* toY = strtok(NULL, " "); char* toZ = strtok(NULL, " "); if (!toX) { Player* player = handler->GetSession()->GetPlayer(); object->Relocate(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), object->GetOrientation()); object->DestroyForNearbyPlayers(); object->UpdateObjectVisibility(); } else { if (!toY || !toZ) return false; float x = (float)atof(toX); float y = (float)atof(toY); float z = (float)atof(toZ); if (!MapManager::IsValidMapCoord(object->GetMapId(), x, y, z)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, object->GetMapId()); handler->SetSentErrorMessage(true); return false; } object->Relocate(x, y, z, object->GetOrientation()); object->DestroyForNearbyPlayers(); object->UpdateObjectVisibility(); } object->SaveToDB(); object->Refresh(); handler->PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, object->GetGUIDLow(), object->GetGOInfo()->name.c_str(), object->GetGUIDLow()); return true; }
bool ChatHandler::HandleObjectCommand(const char* args) { WorldPacket data; if (!*args) return false; uint32 display_id = atoi((char*)args); char* safe = strtok((char*)args, " "); Player *chr = m_session->GetPlayer(); float x = chr->GetPositionX(); float y = chr->GetPositionY(); float z = chr->GetPositionZ(); float o = chr->GetOrientation(); GameObject* pGameObj = new GameObject(); pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), display_id, chr->GetMapId(), x, y, z, o, 0, 0, 0, 0); pGameObj->SetZoneId(chr->GetZoneId()); pGameObj->SetUInt32Value(GAMEOBJECT_TYPE_ID, 19); Log::getSingleton( ).outError("AddObject at Level3.cpp line 252"); MapManager::Instance().GetMap(pGameObj->GetMapId())->Add(pGameObj); if(strcmp(safe,"true") == 0) pGameObj->SaveToDB(); return true; }
GameObject* ObjectAccessor::GetGameObject(WorldObject const &u, uint64 guid) { GameObject * ret = GetObjectInWorld(guid, (GameObject*)NULL); if(!ret) return NULL; if(ret->GetMapId() != u.GetMapId()) return NULL; if(ret->GetInstanceId() != u.GetInstanceId()) return NULL; return ret; }
void WorldSession::HandleDuelCancelledOpcode(WorldPacket& recvPacket) { sLog.outString( "HandleDuelCancelledOpcode.\n" ); uint64 guid; Player *pl; Player *plTarget; WorldPacket data; recvPacket >> guid; pl = GetPlayer(); //get player plTarget = objmgr.GetPlayer(pl->m_duelGUID); data.Initialize(SMSG_GAMEOBJECT_DESPAWN_ANIM); data << (uint64)guid; pl->GetSession()->SendPacket(&data); plTarget->GetSession()->SendPacket(&data); data.Initialize(SMSG_DESTROY_OBJECT); data << (uint64)guid; pl->GetSession()->SendPacket(&data); plTarget->GetSession()->SendPacket(&data); data.Initialize(SMSG_DUEL_COMPLETE); data << (uint8)0; // Duel Cancel pl->GetSession()->SendPacket(&data); plTarget->GetSession()->SendPacket(&data); pl->m_isInDuel = false; plTarget->m_isInDuel = false; GameObject* obj = NULL; #ifndef ENABLE_GRID_SYSTEM obj = objmgr.GetObject<GameObject>(guid); #else if( pl ) obj = ObjectAccessor::Instance().GetGameObject(*pl, guid); #endif if(obj) { #ifndef ENABLE_GRID_SYSTEM obj->RemoveFromMap(); objmgr.RemoveObject(obj); #else MapManager::Instance().GetMap(obj->GetMapId())->RemoveFromMap(obj); #endif } }
bool ChatHandler::HandleGameObjectCommand(const char* args) { if (!*args) return false; WorldPacket data; uint32 display_id = atoi((char*)args); if(!display_id) return false; uint16 typesid = atoi((char*)args); if(!typesid) return false; uint16 factionid = atoi((char*)args); if(!factionid) return false; uint32 fieldentry = atoi((char*)args); if(!fieldentry) return false; Player *chr = m_session->GetPlayer(); float x = chr->GetPositionX(); float y = chr->GetPositionY(); float z = chr->GetPositionZ(); float o = chr->GetOrientation(); uint32 guidlow = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT); Log::getSingleton( ).outError("GameObjectGUIDlow %u",guidlow); GameObject* pGameObj = new GameObject(); pGameObj->Create(guidlow, display_id, chr->GetMapId(), x, y, z, o, 0, 0, 0, 0); pGameObj->SetUInt32Value(OBJECT_FIELD_ENTRY, fieldentry); pGameObj->SetUInt32Value(GAMEOBJECT_TYPE_ID, typesid); pGameObj->SetZoneId(chr->GetZoneId()); Log::getSingleton( ).outError("AddObject at Level3.cpp line 252"); MapManager::Instance().GetMap(pGameObj->GetMapId())->Add(pGameObj); pGameObj->SaveToDB(); return true; }
bool ChatHandler::HandleMoveObjectCommand(const char* args) { if(!*args) return false; char* plowguid = strtok((char*)args, " "); if(!plowguid) return false; uint32 lowguid = (uint32)atoi(plowguid); GameObject* obj = ObjectAccessor::Instance().GetGameObject(*m_session->GetPlayer(), MAKE_GUID(lowguid, HIGHGUID_GAMEOBJECT)); if(!obj) { PSendSysMessage("Game Object (GUID: %u) not found", lowguid); return true; } char* px = strtok(NULL, " "); char* py = strtok(NULL, " "); char* pz = strtok(NULL, " "); if (!px) { Player *chr = m_session->GetPlayer(); obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation()); obj->SetFloatValue(GAMEOBJECT_POS_X, chr->GetPositionX()); obj->SetFloatValue(GAMEOBJECT_POS_Y, chr->GetPositionY()); obj->SetFloatValue(GAMEOBJECT_POS_Z, chr->GetPositionZ()); } else { if(!py || !pz) return false; float x = (float)atof(px); float y = (float)atof(py); float z = (float)atof(pz); if(!MapManager::IsValidMapCoord(obj->GetMapId(),x,y)) { PSendSysMessage(LANG_INVALID_TARGET_COORD,x,y,obj->GetMapId()); return true; } obj->Relocate(x, y, z, obj->GetOrientation()); obj->SetFloatValue(GAMEOBJECT_POS_X, x); obj->SetFloatValue(GAMEOBJECT_POS_Y, y); obj->SetFloatValue(GAMEOBJECT_POS_Z, z); } obj->SaveToDB(); obj->Refresh(); PSendSysMessage("Game Object (GUID: %u) moved", obj->GetGUIDLow()); return true; }
void WorldSession::HandleGameObjectUseOpcode( WorldPacket & recv_data ) { uint64 guid; uint32 spellId = OPEN_CHEST; const GameObjectInfo *info; recv_data >> guid; sLog.outDebug( "WORLD: Recvd CMSG_GAMEOBJ_USE Message [guid=%u]", guid); GameObject *obj = ObjectAccessor::Instance().GetGameObject(*_player, guid); if(!obj) return; // uint32 t = obj->GetUInt32Value(GAMEOBJECT_TYPE_ID); //obj->SetUInt32Value(GAMEOBJECT_FLAGS,2); //obj->SetUInt32Value(GAMEOBJECT_FLAGS,2); uint32 t = obj->GetUInt32Value(GAMEOBJECT_TYPE_ID); switch(t) { //door case GAMEOBJECT_TYPE_DOOR: //0 obj->SetUInt32Value(GAMEOBJECT_FLAGS,33); obj->SetUInt32Value(GAMEOBJECT_STATE,0); //open //obj->SetUInt32Value(GAMEOBJECT_TIMESTAMP,0x465EE6D2); //load timestamp obj->SetLootState(GO_CLOSED); obj->SetRespawnTime(5); //close door in 5 seconds return; case GAMEOBJECT_TYPE_QUESTGIVER: // 2 _player->PrepareQuestMenu( guid ); _player->SendPreparedQuest( guid ); return; //Sitting: Wooden bench, chairs enzz case GAMEOBJECT_TYPE_CHAIR: //7 info = obj->GetGOInfo(); if(info) { spellId = info->sound0; //guid=GetPlayer()->GetGUID(); _player->TeleportTo(obj->GetMapId(), obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj->GetOrientation(),false,false); //offset 3 is related to the DB _player->SetUInt32Value(UNIT_FIELD_BYTES_1, _player->GetUInt32Value(UNIT_FIELD_BYTES_1) | (3 + spellId) ); return; } break; //big gun, its a spell/aura case GAMEOBJECT_TYPE_GOOBER: //10 //chest locked case GAMEOBJECT_TYPE_SPELLCASTER: //22 obj->SetUInt32Value(GAMEOBJECT_FLAGS,2); info = obj->GetGOInfo(); if(info) { spellId = info->sound0; if (spellId == 0) spellId = info->sound3; guid=_player->GetGUID(); } break; //fishing bobber case GAMEOBJECT_TYPE_FISHINGNODE: //17 { if(_player->GetGUID() != obj->GetOwnerGUID()) return; switch(obj->getLootState()) { case GO_CLOSED: // ready for loot { // 1) skill must beb >= base_zone_skill // 2) if skill == base_zone_skill => 5% chance // 3) chance is liniar dependence from (base_zone_skill-skill) int32 skill = _player->GetSkillValue(SKILL_FISHING); int32 zone_skill = _player->FishingMinSkillForCurrentZone(); int32 chance = skill - zone_skill + 5; int32 roll = irand(1,100); DEBUG_LOG("Fishing check (skill: %i zone min skill: %i chance %i roll: %i",skill,zone_skill,chance,roll); if(skill >= zone_skill && chance >= roll) { // prevent removing GO at spell cancel _player->RemoveGameObject(obj,false); obj->SetOwnerGUID(_player->GetGUID()); //fish catched _player->UpdateFishingSkill(); _player->SendLoot(obj->GetGUID(),LOOT_FISHING); } else { // fish escaped obj->SetLootState(GO_LOOTED); // can be deleted now WorldPacket data(SMSG_FISH_ESCAPED, 0); SendPacket(&data); } break; } case GO_LOOTED: // nothing to do, wiil be deleted at next update break; default: { obj->SetLootState(GO_LOOTED); WorldPacket data(SMSG_FISH_NOT_HOOKED, 0); SendPacket(&data); break; } } if(_player->m_currentSpell) { _player->m_currentSpell->SendChannelUpdate(0); _player->m_currentSpell->finish(); } return; } obj->CountUseTimes(); case GAMEOBJECT_TYPE_FLAGSTAND: //24 //GB flag info = obj->GetGOInfo(); if(info) { spellId = info->sound0; guid=_player->GetGUID(); } break; case GAMEOBJECT_TYPE_FLAGDROP: //26 //GB flag dropped info = obj->GetGOInfo(); if(info) { spellId = info->sound0; guid=_player->GetGUID(); } break; case GAMEOBJECT_TYPE_CUSTOM_TELEPORTER: info = obj->GetGOInfo(); if(info) { AreaTrigger *fields = objmgr.GetAreaTrigger( info->sound0 ); if(fields) { sLog.outDebug( "Teleporting player %u with coordinates X: %f Y: %f Z: %f Orientation: %f Map: %u\n", _player->GetGUIDLow(), fields->X,fields->Y,fields->Z,fields->Orientation,fields->mapId); _player->TeleportTo(fields->mapId, fields->X,fields->Y,fields->Z,fields->Orientation); sLog.outDebug( "Player %u teleported by %u\n", _player->GetGUIDLow(), info->sound0); } else sLog.outDebug( "Unknown areatrigger_template id %u\n", info->sound0); delete fields; return; } break; default: sLog.outDebug( "Unknown Object Type %u\n", obj->GetUInt32Value(GAMEOBJECT_TYPE_ID)); break; } SpellEntry const *spellInfo = sSpellStore.LookupEntry( spellId ); if(!spellInfo) { sLog.outError("WORLD: unknown spell id %i\n", spellId); return; } Spell *spell = new Spell(_player, spellInfo, false, 0); SpellCastTargets targets; targets.setUnitTarget( _player ); targets.m_GOTarget = obj; spell->prepare(&targets); }
//move selected object static bool HandleGameObjectMoveCommand(ChatHandler* handler, const char* args) { // number or [name] Shift-click form |color|Hgameobject:go_guid|h[name]|h|r char* cId = handler->extractKeyFromLink((char*)args,"Hgameobject"); if (!cId) return false; uint32 lowguid = atoi(cId); if (!lowguid) return false; GameObject* obj = NULL; // by DB guid if (GameObjectData const* go_data = sObjectMgr->GetGOData(lowguid)) obj = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(lowguid,go_data->id); if (!obj) { handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, lowguid); handler->SetSentErrorMessage(true); return false; } char* px = strtok(NULL, " "); char* py = strtok(NULL, " "); char* pz = strtok(NULL, " "); if (!px) { Player *chr = handler->GetSession()->GetPlayer(); obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation()); obj->DestroyForNearbyPlayers(); obj->UpdateObjectVisibility(); } else { if (!py || !pz) return false; float x = (float)atof(px); float y = (float)atof(py); float z = (float)atof(pz); if (!MapManager::IsValidMapCoord(obj->GetMapId(),x,y,z)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD,x,y,obj->GetMapId()); handler->SetSentErrorMessage(true); return false; } obj->Relocate(x, y, z, obj->GetOrientation()); obj->DestroyForNearbyPlayers(); obj->UpdateObjectVisibility(); } obj->SaveToDB(); obj->Refresh(); handler->PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, obj->GetGUIDLow(), obj->GetGOInfo()->name, obj->GetGUIDLow()); return true; }
bool ChatHandler::HandleGODelete(const char* args, WorldSession* m_session) { GameObject* GObj = m_session->GetPlayer()->GetSelectedGo(); if(GObj == NULL) { RedSystemMessage(m_session, "No selected GameObject..."); return true; } if(GObj->IsInBg()) { RedSystemMessage(m_session, "GameObjects can't be deleted in Battlegrounds"); return true; } if(GObj->m_spawn != NULL && GObj->m_spawn->entry == GObj->GetEntry()) { uint32 cellx = uint32(((_maxX - GObj->m_spawn->x) / _cellSize)); uint32 celly = uint32(((_maxY - GObj->m_spawn->y) / _cellSize)); if(cellx < _sizeX && celly < _sizeY) { CellSpawns* sp = GObj->GetMapMgr()->GetBaseMap()->GetSpawnsList(cellx, celly); if(sp != NULL) { for(GOSpawnList::iterator itr = sp->GOSpawns.begin(); itr != sp->GOSpawns.end(); ++itr) if((*itr) == GObj->m_spawn) { sp->GOSpawns.erase(itr); break; } } GObj->DeleteFromDB(); delete GObj->m_spawn; GObj->m_spawn = NULL; } } sGMLog.writefromsession(m_session, "deleted game object entry %u on map %u at X:%f Y:%f Z:%f Name %s", GObj->GetEntry(), GObj->GetMapId(), GObj->GetPositionX(), GObj->GetPositionY(), GObj->GetPositionZ(), GameObjectNameStorage.LookupEntry(GObj->GetEntry())->Name); GObj->Despawn(0, 0); // We do not need to delete the object because GameObject::Despawn with no time => ExpireAndDelete() => _Expire() => delete GObj; m_session->GetPlayer()->m_GM_SelectedGO = 0; return true; }
//move selected object static bool HandleGameObjectMoveCommand(ChatHandler* handler, char const* args) { // number or [name] Shift-click form |color|Hgameobject:go_guid|h[name]|h|r char* id = handler->extractKeyFromLink((char*)args, "Hgameobject"); if (!id) return false; ObjectGuid::LowType guidLow = atoul(id); if (!guidLow) return false; GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow); if (!object) { handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, guidLow); handler->SetSentErrorMessage(true); return false; } char* toX = strtok(nullptr, " "); char* toY = strtok(nullptr, " "); char* toZ = strtok(nullptr, " "); float x, y, z; if (!toX) { Player* player = handler->GetSession()->GetPlayer(); player->GetPosition(x, y, z); } else { if (!toY || !toZ) return false; x = (float)atof(toX); y = (float)atof(toY); z = (float)atof(toZ); if (!MapManager::IsValidMapCoord(object->GetMapId(), x, y, z)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, object->GetMapId()); handler->SetSentErrorMessage(true); return false; } } Map* map = object->GetMap(); object->Relocate(x, y, z, object->GetOrientation()); object->SaveToDB(); // Generate a completely new spawn with new guid // 3.3.5a client caches recently deleted objects and brings them back to life // when CreateObject block for this guid is received again // however it entirely skips parsing that block and only uses already known location object->Delete(); object = new GameObject(); if (!object->LoadFromDB(guidLow, map, true)) { delete object; return false; } handler->PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, object->GetSpawnId(), object->GetGOInfo()->name.c_str(), object->GetSpawnId()); return true; }
static bool GOMove_Command(ChatHandler* handler, const char* args) { if (!args) return false; char* ID_t = strtok((char*)args, " "); if (!ID_t) return false; uint32 ID = (uint32)atol(ID_t); char* GObjectID_C = strtok(NULL, " "); uint32 GObjectID = 0; bool isHex = false; if (GObjectID_C) { GObjectID = strtoul(GObjectID_C, NULL, 0); // can take in hex as well as dec isHex = (std::string(GObjectID_C).find("0x") != std::string::npos); } char* ARG_t = strtok(NULL, " "); uint32 ARG = 0; if (ARG_t) ARG = (uint32)atol(ARG_t); WorldSession* session = handler->GetSession(); Player* player = session->GetPlayer(); uint64 playerGUID = player->GetGUID(); if (ID < SPAWN) // no args { if (ID >= DELET && ID <= GOTO) // has target (needs retrieve gameobject) { GameObject* target = GetObjectByGObjectID(player, GObjectID, isHex); if (!target) ChatHandler(player->GetSession()).PSendSysMessage("Object GUID: %u not found. Temp(%u)", GObjectID, isHex ? 1 : 0); else { float x,y,z,o; target->GetPosition(x,y,z,o); uint32 p = target->GetPhaseMask(); switch(ID) { case DELET: DeleteObject(target/*, isHex ? GObjectID : 0*/); SendSelectionInfo(player, GObjectID, isHex, false); break; case X: SpawnObject(player,player->GetPositionX(),y,z,o,p,true,GObjectID, isHex); break; case Y: SpawnObject(player,x,player->GetPositionY(),z,o,p,true,GObjectID, isHex); break; case Z: SpawnObject(player,x,y,player->GetPositionZ(),o,p,true,GObjectID, isHex); break; case O: SpawnObject(player,x,y,z,player->GetOrientation(),p,true,GObjectID, isHex); break; case GOTO: player->TeleportTo(target->GetMapId(), x,y,z,o); break; case RESPAWN: SpawnObject(player,x,y,z,o,p,false,target->GetEntry(), isHex); break; case GROUND: { float ground = target->GetMap()->GetHeight(target->GetPhaseMask(), x, y, MAX_HEIGHT); if(ground != INVALID_HEIGHT) SpawnObject(player,x,y,ground,o,p,true,GObjectID, isHex); } break; } } } else { switch(ID) { case TEST: session->SendAreaTriggerMessage(player->GetName().c_str()); break; case FACE: { float piper2 = M_PI/2; float multi = player->GetOrientation()/piper2; float multi_int = floor(multi); float new_ori = (multi-multi_int > 0.5f) ? (multi_int+1)*piper2 : multi_int*piper2; player->SetFacingTo(new_ori); } break; case SAVE: SaveObject(player, GObjectID, isHex); break; case SELECTNEAR: { GameObject* object = handler->GetNearbyGameObject(); object = GetClosestGObjectID(player, object); if (!object) ChatHandler(player->GetSession()).PSendSysMessage("No objects found"); else { bool isHex = (object->GetGUIDHigh() != HIGHGUID_GAMEOBJECT); SendSelectionInfo(player, isHex ? object->GetGUIDHigh() : object->GetDBTableGUIDLow() ? object->GetDBTableGUIDLow() : object->GetGUIDLow(), isHex, true); session->SendAreaTriggerMessage("Selected %s", object->GetName().c_str()); } } break; } } } else if (ARG && ID >= SPAWN) { if (ID >= NORTH && ID <= PHASE) { GameObject* target = GetObjectByGObjectID(player, GObjectID, isHex); if (!target) ChatHandler(player->GetSession()).PSendSysMessage("Object GUID: %u not found. Temporary: %s", GObjectID, isHex ? "true" : "false"); else { float x,y,z,o; target->GetPosition(x,y,z,o); uint32 p = target->GetPhaseMask(); switch(ID) { case NORTH: SpawnObject(player,x+((float)ARG/100),y,z,o,p,true,GObjectID, isHex); break; case EAST: SpawnObject(player,x,y-((float)ARG/100),z,o,p,true,GObjectID, isHex); break; case SOUTH: SpawnObject(player,x-((float)ARG/100),y,z,o,p,true,GObjectID, isHex); break; case WEST: SpawnObject(player,x,y+((float)ARG/100),z,o,p,true,GObjectID, isHex); break; case NORTHEAST: SpawnObject(player,x+((float)ARG/100),y-((float)ARG/100),z,o,p,true,GObjectID, isHex); break; case SOUTHEAST: SpawnObject(player,x-((float)ARG/100),y-((float)ARG/100),z,o,p,true,GObjectID, isHex); break; case SOUTHWEST: SpawnObject(player,x-((float)ARG/100),y+((float)ARG/100),z,o,p,true,GObjectID, isHex); break; case NORTHWEST: SpawnObject(player,x+((float)ARG/100),y+((float)ARG/100),z,o,p,true,GObjectID, isHex); break; case UP: SpawnObject(player,x,y,z+((float)ARG/100),o,p,true,GObjectID, isHex); break; case DOWN: SpawnObject(player,x,y,z-((float)ARG/100),o,p,true,GObjectID, isHex); break; case RIGHT: SpawnObject(player,x,y,z,o-((float)ARG/100),p,true,GObjectID, isHex); break; case LEFT: SpawnObject(player,x,y,z,o+((float)ARG/100),p,true,GObjectID, isHex); break; case PHASE: SpawnObject(player,x,y,z,o,ARG,true,GObjectID, isHex); break; } } } else { switch(ID) { case SPAWN: { if (SpawnObject(player, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), player->GetPhaseMaskForSpawn(), false, ARG, false, true)) SpawnQue[player->GetGUID()] = ARG; } break; case SPAWNSPELL: { SpawnQue[player->GetGUID()] = ARG; } break; case SELECTALLNEAR: { if (ARG > 5000) ARG = 5000; QueryResult result = WorldDatabase.PQuery("SELECT guid, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE map = '%u' AND position_x BETWEEN '%f'-'%u' AND '%f'+'%u' AND position_y BETWEEN '%f'-'%u' AND '%f'+'%u' AND position_z BETWEEN '%f'-'%u' AND '%f'+'%u' ORDER BY order_ ASC LIMIT 100", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), player->GetPositionX(), ARG, player->GetPositionX(), ARG, player->GetPositionY(), ARG, player->GetPositionY(), ARG, player->GetPositionZ(), ARG, player->GetPositionZ(), ARG); if (result) { do { Field* fields = result->Fetch(); uint32 guidLow = fields[0].GetUInt32(); if (GameObject* object = GetObjectByGObjectID(player, guidLow, false)) SendSelectionInfo(player, guidLow, false, true); } while (result->NextRow()); } for(std::set<uint32>::const_iterator it = GObjects.begin(); it != GObjects.end();) { GameObject* temp = player->GetGameObject(*it); if(!temp) { GObjects.erase(*it++); continue; } if(temp->IsWithinDistInMap(player, ARG)) SendSelectionInfo(player, (*it), true, true); ++it; } } break; } } } else return false; return true; }
bool ChatHandler::HandleGODelete(const char *args, WorldSession *m_session) { GameObject *GObj = m_session->GetPlayer()->GetSelectedGo(); if( GObj == NULL ) { RedSystemMessage(m_session, "No selected GameObject..."); return true; } if( GObj->m_spawn != NULL && GObj->m_spawn->entry == GObj->GetEntry() ) { uint32 cellx = uint32(((_maxX-GObj->m_spawn->x)/_cellSize)); uint32 celly = uint32(((_maxY-GObj->m_spawn->y)/_cellSize)); if( cellx < _sizeX && celly < _sizeY ) { CellSpawns * sp = GObj->GetMapMgr()->GetBaseMap()->GetSpawnsList( cellx, celly ); if( sp != NULL ) { for( GOSpawnList::iterator itr = sp->GOSpawns.begin(); itr != sp->GOSpawns.end(); ++itr ) if( (*itr) == GObj->m_spawn ) { sp->GOSpawns.erase( itr ); break; } } GObj->DeleteFromDB(); delete GObj->m_spawn; GObj->m_spawn = NULL; } } GObj->Despawn(0, 0); // We do not need to delete the object because GameObject::Despawn with no time => ExpireAndDelete() => _Expire() => delete GObj; sGMLog.writefromsession(m_session,"deleted game object entry %u on map %u at X:%f Y:%f Z:%f Name %s", GObj->GetEntry(),GObj->GetMapId(),GObj->GetPositionX(),GObj->GetPositionY(),GObj->GetPositionZ(),GameObjectNameStorage.LookupEntry(GObj->GetEntry())->Name); m_session->GetPlayer()->m_GM_SelectedGO = 0; /* std::stringstream sstext; GameObject *GObj = m_session->GetPlayer()->m_GM_SelectedGO; if( !GObj ) { RedSystemMessage(m_session, "No selected GameObject..."); return true; } GObj->GetMapMgr()->GetBaseMap()->GetTemplate()->RemoveIndex<GameObject>(GObj); // remove index GObj->Despawn(3600000); GObj->DeleteFromDB(); sObjHolder.Delete<GameObject>(GObj); m_session->GetPlayer()->m_GM_SelectedGO = NULL; GreenSystemMessage(m_session, "GameObject successfully deleted from world and database !"); */ return true; }
void WorldSession::HandleGameObjectUseOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data,8); uint64 guid; uint32 spellId = OPEN_CHEST; const GameObjectInfo *info; recv_data >> guid; sLog.outDebug( "WORLD: Recvd CMSG_GAMEOBJ_USE Message [guid=%u]", guid); GameObject *obj = ObjectAccessor::GetGameObject(*_player, guid); if(!obj) return; //obj->SetUInt32Value(GAMEOBJECT_FLAGS,2); //obj->SetUInt32Value(GAMEOBJECT_FLAGS,2); // default spell caster is player that use GO Unit* spellCaster = GetPlayer(); // default spell target is player that use GO Unit* spellTarget = GetPlayer(); if (Script->GOHello(_player, obj)) return; switch(obj->GetGoType()) { case GAMEOBJECT_TYPE_DOOR: //0 obj->SetUInt32Value(GAMEOBJECT_FLAGS,33); obj->SetUInt32Value(GAMEOBJECT_STATE,0); //open //obj->SetUInt32Value(GAMEOBJECT_TIMESTAMP,0x465EE6D2); //load timestamp obj->SetLootState(GO_CLOSED); obj->SetRespawnTime(5); //close door in 5 seconds return; case GAMEOBJECT_TYPE_BUTTON: //1 obj->SetUInt32Value(GAMEOBJECT_FLAGS,33); obj->SetUInt32Value(GAMEOBJECT_STATE,0); //open obj->SetLootState(GO_CLOSED); obj->SetRespawnTime(2); //close in 1 seconds // activate script sWorld.ScriptsStart(sButtonScripts, obj->GetDBTableGUIDLow(), spellCaster, obj); return; case GAMEOBJECT_TYPE_QUESTGIVER: //2 _player->PrepareQuestMenu( guid ); _player->SendPreparedQuest( guid ); return; //Sitting: Wooden bench, chairs enzz case GAMEOBJECT_TYPE_CHAIR: //7 info = obj->GetGOInfo(); if(info) { //spellId = info->data0; // this is not a spell or offset _player->TeleportTo(obj->GetMapId(), obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj->GetOrientation(),false,false); _player->SetFlag(UNIT_FIELD_BYTES_1,PLAYER_STATE_SIT_LOW_CHAIR); // Using (3 + spellId) was wrong, this is a number of slot for chair/bench, not offset _player->SetStandState(PLAYER_STATE_SIT_LOW_CHAIR); return; } break; //big gun, its a spell/aura case GAMEOBJECT_TYPE_GOOBER: //10 info = obj->GetGOInfo(); spellId = info ? info->data10 : 0; break; case GAMEOBJECT_TYPE_SPELLCASTER: //22 obj->SetUInt32Value(GAMEOBJECT_FLAGS,2); info = obj->GetGOInfo(); if(info) { spellId = info->data0; if (spellId == 0) spellId = info->data3; //guid=_player->GetGUID(); } break; case GAMEOBJECT_TYPE_CAMERA: //13 info = obj->GetGOInfo(); if(info) { uint32 cinematic_id = info->data1; if(cinematic_id) { WorldPacket data(SMSG_TRIGGER_CINEMATIC, 4); data << cinematic_id; _player->GetSession()->SendPacket(&data); } return; } break; //fishing bobber case GAMEOBJECT_TYPE_FISHINGNODE: //17 { if(_player->GetGUID() != obj->GetOwnerGUID()) return; switch(obj->getLootState()) { case GO_CLOSED: // ready for loot { // 1) skill must be >= base_zone_skill // 2) if skill == base_zone_skill => 5% chance // 3) chance is linear dependence from (base_zone_skill-skill) int32 skill = _player->GetSkillValue(SKILL_FISHING); int32 zone_skill = _player->FishingMinSkillForCurrentZone(); int32 chance = skill - zone_skill + 5; int32 roll = irand(1,100); DEBUG_LOG("Fishing check (skill: %i zone min skill: %i chance %i roll: %i",skill,zone_skill,chance,roll); if(skill >= zone_skill && chance >= roll) { // prevent removing GO at spell cancel _player->RemoveGameObject(obj,false); obj->SetOwnerGUID(_player->GetGUID()); //fish catched _player->UpdateFishingSkill(); _player->SendLoot(obj->GetGUID(),LOOT_FISHING); } else { // fish escaped obj->SetLootState(GO_LOOTED); // can be deleted now WorldPacket data(SMSG_FISH_ESCAPED, 0); SendPacket(&data); } break; } case GO_LOOTED: // nothing to do, will be deleted at next update break; default: { obj->SetLootState(GO_LOOTED); WorldPacket data(SMSG_FISH_NOT_HOOKED, 0); SendPacket(&data); break; } } if(_player->m_currentSpells[CURRENT_CHANNELED_SPELL]) { _player->m_currentSpells[CURRENT_CHANNELED_SPELL]->SendChannelUpdate(0); _player->m_currentSpells[CURRENT_CHANNELED_SPELL]->finish(); } return; } case GAMEOBJECT_TYPE_SUMMONING_RITUAL: { Unit* caster = obj->GetOwner(); info = obj->GetGOInfo(); if( !caster || caster->GetTypeId()!=TYPEID_PLAYER ) return; // accept only use by player from same group for caster except caster itself if(((Player*)caster)==GetPlayer() || !((Player*)caster)->IsInSameGroupWith(GetPlayer())) return; obj->AddUse(GetPlayer()); // must 2 group members use GO, or only 1 when it is meeting stone summon if(obj->GetUniqueUseCount() < (info->data0 == 2 ? 1 : 2)) return; // in case summoning ritual caster is GO creator spellCaster = caster; if(!caster->m_currentSpells[CURRENT_CHANNELED_SPELL]) return; spellId = info->data1; // finish spell caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->SendChannelUpdate(0); caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->finish(); // can be deleted now obj->SetLootState(GO_LOOTED); // go to end function to spell casting break; } case GAMEOBJECT_TYPE_MEETINGSTONE: //23 { info = obj->GetGOInfo(); Player* targetPlayer = ObjectAccessor::FindPlayer(((Player*)spellCaster)->GetSelection()); // accept only use by player from same group for caster except caster itself if(!targetPlayer || targetPlayer == GetPlayer() || !targetPlayer->IsInSameGroupWith(GetPlayer())) return; //required lvl checks! uint8 level = _player->getLevel(); if (level < info->data0 || level > info->data1) return; level = targetPlayer->getLevel(); if (level < info->data0 || level > info->data1) return; spellId = 23598; break; } case GAMEOBJECT_TYPE_FLAGSTAND: // 24 if(_player->InBattleGround() && // in battleground !_player->IsMounted() && // not mounted !_player->HasStealthAura() && // not stealthed !_player->HasInvisibilityAura() && // not invisible _player->isAlive()) // live player { BattleGround *bg = _player->GetBattleGround(); if(!bg) return; // BG flag click // AB: // 15001 // 15002 // 15003 // 15004 // 15005 // WS: // 179830 - Silverwing Flag // 179831 - Warsong Flag // EotS: // 184141 - Netherstorm Flag info = obj->GetGOInfo(); if(info) { switch(info->id) { case 179830: // check if it's correct bg if(bg->GetTypeID() != BATTLEGROUND_WS) return; // check if flag dropped if(((BattleGroundWS*)bg)->GetFlagState(ALLIANCE) != BG_WS_FLAG_STATE_ON_BASE) return; // check if it's correct flag if(((BattleGroundWS*)bg)->m_bgobjects[BG_WS_OBJECT_A_FLAG] != obj->GetGUID()) return; // check player team if(_player->GetTeam() == ALLIANCE) return; spellId = 23335; // Silverwing Flag break; case 179831: // check if it's correct bg if(bg->GetTypeID() != BATTLEGROUND_WS) return; // check if flag dropped if(((BattleGroundWS*)bg)->GetFlagState(HORDE) != BG_WS_FLAG_STATE_ON_BASE) return; // check if it's correct flag if(((BattleGroundWS*)bg)->m_bgobjects[BG_WS_OBJECT_H_FLAG] != obj->GetGUID()) return; // check player team if(_player->GetTeam() == HORDE) return; spellId = 23333; // Warsong Flag break; case 184141: // check if it's correct bg if(bg->GetTypeID() != BATTLEGROUND_EY) return; spellId = 34976; // Netherstorm Flag break; } } } break; case GAMEOBJECT_TYPE_FLAGDROP: // 26 if(_player->InBattleGround() && // in battleground !_player->IsMounted() && // not mounted !_player->HasStealthAura() && // not stealthed !_player->HasInvisibilityAura() && // not invisible _player->isAlive()) // live player { BattleGround *bg = _player->GetBattleGround(); if(!bg) return; // BG flag dropped // WS: // 179785 - Silverwing Flag // 179786 - Warsong Flag // EotS: // 184142 - Netherstorm Flag info = obj->GetGOInfo(); if(info) { switch(info->id) { case 179785: // Silverwing Flag // check if it's correct bg if(bg->GetTypeID() != BATTLEGROUND_WS) return; // check if flag dropped if(((BattleGroundWS*)bg)->GetFlagState(ALLIANCE) != BG_WS_FLAG_STATE_ON_GROUND) return; obj->Delete(); if(_player->GetTeam() == ALLIANCE) { ((BattleGroundWS*)bg)->EventPlayerReturnedFlag(_player); return; } else { _player->CastSpell(_player, 23335, true); return; } break; case 179786: // Warsong Flag // check if it's correct bg if(bg->GetTypeID() != BATTLEGROUND_WS) return; // check if flag dropped if(((BattleGroundWS*)bg)->GetFlagState(HORDE) != BG_WS_FLAG_STATE_ON_GROUND) return; obj->Delete(); if(_player->GetTeam() == HORDE) { ((BattleGroundWS*)bg)->EventPlayerReturnedFlag(_player); return; } else { _player->CastSpell(_player, 23333, true); return; } break; } } obj->Delete(); } break; default: sLog.outDebug("Unknown Object Type %u\n", obj->GetGoType()); break; } if (!spellId) return; SpellEntry const *spellInfo = sSpellStore.LookupEntry( spellId ); if(!spellInfo) { sLog.outError("WORLD: unknown spell id %u\n", spellId); return; } Spell *spell = new Spell(spellCaster, spellInfo, false, 0); SpellCastTargets targets; targets.setUnitTarget( spellTarget ); if(obj) targets.setGOTarget( obj ); spell->prepare(&targets); }
//move selected object static bool HandleGameObjectMoveCommand(ChatHandler* handler, char const* args) { // number or [name] Shift-click form |color|Hgameobject:go_guid|h[name]|h|r char* id = handler->extractKeyFromLink((char*)args, "Hgameobject"); if (!id) return false; uint32 guidLow = atoi(id); if (!guidLow) return false; GameObject* object = nullptr; // by DB guid if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow)) object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id); if (!object) { handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, guidLow); handler->SetSentErrorMessage(true); return false; } char* toX = strtok(nullptr, " "); char* toY = strtok(nullptr, " "); char* toZ = strtok(nullptr, " "); if (!toX) { Player* player = handler->GetSession()->GetPlayer(); object->GetMap()->GameObjectRelocation(object, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), object->GetOrientation()); object->DestroyForNearbyPlayers(); object->UpdateObjectVisibility(); } else { if (!toY || !toZ) return false; float x = (float)atof(toX); float y = (float)atof(toY); float z = (float)atof(toZ); if (!MapManager::IsValidMapCoord(object->GetMapId(), x, y, z)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, object->GetMapId()); handler->SetSentErrorMessage(true); return false; } object->GetMap()->GameObjectRelocation(object, x, y, z, object->GetOrientation()); object->DestroyForNearbyPlayers(); object->UpdateObjectVisibility(); } object->SaveToDB(); object->Refresh(); handler->PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, object->GetGUIDLow(), object->GetGOInfo()->name.c_str(), object->GetGUIDLow()); return true; }