bool ChatHandler::HandleGOSpawn(const char* args, WorldSession* m_session) { std::stringstream sstext; char* pEntryID = strtok((char*)args, " "); if(!pEntryID) return false; uint32 EntryID = atoi(pEntryID); bool Save = false; char* pSave = strtok(NULL, " "); if(pSave) Save = (atoi(pSave) > 0 ? true : false); GameObjectInfo* goi = GameObjectNameStorage.LookupEntry(EntryID); if(!goi) { sstext << "GameObject Info '" << EntryID << "' Not Found" << '\0'; SystemMessage(m_session, sstext.str().c_str()); return true; } LOG_DEBUG("Spawning GameObject By Entry '%u'", EntryID); sstext << "Spawning GameObject By Entry '" << EntryID << "'" << '\0'; SystemMessage(m_session, sstext.str().c_str()); Player* chr = m_session->GetPlayer(); GameObject* go = chr->GetMapMgr()->CreateGameObject(EntryID); uint32 mapid = chr->GetMapId(); float x = chr->GetPositionX(); float y = chr->GetPositionY(); float z = chr->GetPositionZ(); float o = chr->GetOrientation(); go->CreateFromProto(EntryID, mapid, x, y, z, o); go->PushToWorld(chr->GetMapMgr()); go->Phase(PHASE_SET, chr->GetPhase()); // Create spawn instance GOSpawn* gs = new GOSpawn; gs->entry = go->GetEntry(); gs->facing = go->GetOrientation(); gs->faction = go->GetFaction(); gs->flags = go->GetUInt32Value(GAMEOBJECT_FLAGS); gs->id = objmgr.GenerateGameObjectSpawnID(); gs->o = 0.0f; gs->o1 = go->GetParentRotation(0); gs->o2 = go->GetParentRotation(2); gs->o3 = go->GetParentRotation(3); gs->scale = go->GetScale(); gs->x = go->GetPositionX(); gs->y = go->GetPositionY(); gs->z = go->GetPositionZ(); gs->state = go->GetByte(GAMEOBJECT_BYTES_1, 0); //gs->stateNpcLink = 0; gs->phase = go->GetPhase(); gs->overrides = go->GetOverrides(); uint32 cx = chr->GetMapMgr()->GetPosX(chr->GetPositionX()); uint32 cy = chr->GetMapMgr()->GetPosY(chr->GetPositionY()); chr->GetMapMgr()->GetBaseMap()->GetSpawnsListAndCreate(cx, cy)->GOSpawns.push_back(gs); go->m_spawn = gs; MapCell* mCell = chr->GetMapMgr()->GetCell(cx, cy); if(mCell != NULL) mCell->SetLoaded(); if(Save == true) { // If we're saving, create template and add index go->SaveToDB(); go->m_loadedFromDB = true; } sGMLog.writefromsession(m_session, "spawned gameobject %s, entry %u at %u %f %f %f%s", GameObjectNameStorage.LookupEntry(gs->entry)->Name, gs->entry, chr->GetMapId(), gs->x, gs->y, gs->z, Save ? ", saved in DB" : ""); return true; }
void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z) { Map const* oldMap = GetMap(); if (oldMap->GetId() != newMapid) { Map* newMap = sMapMgr->CreateBaseMap(newMapid); Map::PlayerList const& oldPlayers = GetMap()->GetPlayers(); if (!oldPlayers.isEmpty()) { UpdateData data; BuildOutOfRangeUpdateBlock(&data); WorldPacket packet; data.BuildPacket(&packet); for (Map::PlayerList::const_iterator itr = oldPlayers.begin(); itr != oldPlayers.end(); ++itr) if (itr->GetSource()->GetTransport() != this) itr->GetSource()->SendDirectMessage(&packet); } UnloadStaticPassengers(); GetMap()->RemoveFromMap<Transport>(this, false); SetMap(newMap); Map::PlayerList const& newPlayers = GetMap()->GetPlayers(); if (!newPlayers.isEmpty()) { for (Map::PlayerList::const_iterator itr = newPlayers.begin(); itr != newPlayers.end(); ++itr) { if (itr->GetSource()->GetTransport() != this) { UpdateData data; BuildCreateUpdateBlockForPlayer(&data, itr->GetSource()); WorldPacket packet; data.BuildPacket(&packet); itr->GetSource()->SendDirectMessage(&packet); } } } for (std::set<WorldObject*>::iterator itr = _passengers.begin(); itr != _passengers.end();) { WorldObject* obj = (*itr++); switch (obj->GetTypeId()) { case TYPEID_UNIT: if (!IS_PLAYER_GUID(obj->ToUnit()->GetOwnerGUID())) // pets should be teleported with player obj->ToCreature()->FarTeleportTo(newMap, x, y, z, obj->GetOrientation()); break; case TYPEID_GAMEOBJECT: { GameObject* go = obj->ToGameObject(); go->GetMap()->RemoveFromMap(go, false); Relocate(x, y, z, go->GetOrientation()); SetMap(newMap); newMap->AddToMap(go); break; } case TYPEID_PLAYER: if (!obj->ToPlayer()->TeleportTo(newMapid, x, y, z, GetOrientation(), TELE_TO_NOT_LEAVE_TRANSPORT)) _passengers.erase(obj); break; default: break; } } GetMap()->AddToMap<Transport>(this); } else { // Teleport players, they need to know it for (std::set<WorldObject*>::iterator itr = _passengers.begin(); itr != _passengers.end(); ++itr) if ((*itr)->GetTypeId() == TYPEID_PLAYER) (*itr)->ToUnit()->NearTeleportTo(x, y, z, GetOrientation()); } UpdatePosition(x, y, z, GetOrientation()); }
//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 = strtoull(id, nullptr, 10); 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, " "); 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; } } object->DestroyForNearbyPlayers(); object->RelocateStationaryPosition(x, y, z, object->GetOrientation()); object->GetMap()->GameObjectRelocation(object, x, y, z, object->GetOrientation()); object->SaveToDB(); handler->PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, object->GetSpawnId(), object->GetGOInfo()->name.c_str(), object->GetGUID().ToString().c_str()); return true; }
void instance_maraudon::Update(uint32 uiDiff) { if (m_uiSpawnTimer <= uiDiff) { m_uiSpawnTimer = 5000; GameObject* pGo = instance->GetGameObject(m_uiLarvaSpewerGUID); if (!pGo || pGo->GetGoState() == GO_STATE_ACTIVE) return; Map::PlayerList const& L = instance->GetPlayers(); if (L.isEmpty()) return; bool spawn = false; for (Map::PlayerList::const_iterator i = L.begin(); i != L.end(); ++i) { Player* P = i->getSource(); if (P && P->isAlive() && P->GetDistance(pGo) <= 45.0f) { spawn = true; break; } } if (spawn) { float coord_dif[2]; for (int i = 0; i < 2; i++) coord_dif[i] = (float)urand(-3,4); if (Creature* C = pGo->SummonCreature(NPC_LARVA,pGo->GetPositionX()+coord_dif[0],pGo->GetPositionY()+coord_dif[1],pGo->GetPositionZ(),pGo->GetOrientation(),TEMPSUMMON_CORPSE_TIMED_DESPAWN,3000)) C->SetInCombatWithZone(); //Unit* target = C->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); //if (target && C->AI()) // C->AI()->AttackStart(target); } } else m_uiSpawnTimer -= uiDiff; }
bool OnUse(Player* player, Item* /*pItem*/, SpellCastTargets const & /*targets*/) { GameObject* go = NULL; for (uint8 i = 0; i < CaribouTrapsNum; ++i) { go = player->FindNearestGameObject(CaribouTraps[i], 5.0f); if (go) break; } if (!go) return false; if (go->FindNearestCreature(NPC_NESINGWARY_TRAPPER, 10.0f, true) || go->FindNearestCreature(NPC_NESINGWARY_TRAPPER, 10.0f, false) || go->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 2.0f)) return true; float x, y, z; go->GetClosePoint(x, y, z, go->GetObjectSize() / 3, 7.0f); go->SummonGameObject(GO_HIGH_QUALITY_FUR, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, 0, 0, 0, 0, 1000); if (TempSummon* summon = player->SummonCreature(NPC_NESINGWARY_TRAPPER, x, y, z, go->GetOrientation(), TEMPSUMMON_DEAD_DESPAWN, 1000)) { summon->SetVisible(false); summon->SetReactState(REACT_PASSIVE); summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); } return false; }
void BattlegroundIC::Update(uint32 diff) { Battleground::Update(diff); if (GetStatus() != STATUS_IN_PROGRESS) return; if (!doorsClosed) { if (closeFortressDoorsTimer <= diff) { GetBGObject(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01)->RemoveFromWorld(); GetBGObject(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01)->RemoveFromWorld(); GetBGObject(BG_IC_GO_ALLIANCE_GATE_3)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED); // Alliance door GetBGObject(BG_IC_GO_HORDE_GATE_1)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED); // Horde door doorsClosed = true; } else closeFortressDoorsTimer -= diff; } for (uint8 i = NODE_TYPE_REFINERY; i < MAX_NODE_TYPES; i++) { if (nodePoint[i].nodeType == NODE_TYPE_DOCKS) { if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) { if (nodePoint[i].timer <= diff) { // we need to confirm this, i am not sure if this every 3 minutes for (uint8 u = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_A : BG_IC_NPC_CATAPULT_1_H); u < (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_4_A : BG_IC_NPC_CATAPULT_4_H); u++) { if (Creature* catapult = GetBGCreature(u)) { if (!catapult->isAlive()) catapult->Respawn(true); } } // we need to confirm this is blizzlike, not sure if it is every 3 minutes for (uint8 u = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_A : BG_IC_NPC_GLAIVE_THROWER_1_H); u < (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_2_A : BG_IC_NPC_GLAIVE_THROWER_2_H); u++) { if (Creature* glaiveThrower = GetBGCreature(u)) { if (!glaiveThrower->isAlive()) glaiveThrower->Respawn(true); } } docksTimer = DOCKS_UPDATE_TIME; } else nodePoint[i].timer -= diff; } } if (nodePoint[i].nodeType == NODE_TYPE_WORKSHOP) { if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) { if (siegeEngineWorkshopTimer <= diff) { uint8 siegeType = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_A : BG_IC_NPC_SIEGE_ENGINE_H); if (Creature* siege = GetBGCreature(siegeType)) // this always should be true { if (siege->isAlive()) { if (siege->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_UNK_14|UNIT_FLAG_OOC_NOT_ATTACKABLE)) // following sniffs the vehicle always has UNIT_FLAG_UNK_14 siege->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_OOC_NOT_ATTACKABLE); else siege->SetHealth(siege->GetMaxHealth()); } else siege->Respawn(true); } // we need to confirm this, i am not sure if this every 3 minutes for (uint8 u = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_A : BG_IC_NPC_DEMOLISHER_1_H); u < (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_4_A : BG_IC_NPC_DEMOLISHER_4_H); u++) { if (Creature* demolisher = GetBGCreature(u)) { if (!demolisher->isAlive()) demolisher->Respawn(true); } } siegeEngineWorkshopTimer = WORKSHOP_UPDATE_TIME; } else siegeEngineWorkshopTimer -= diff; } } // the point is waiting for a change on his banner if (nodePoint[i].needChange) { if (nodePoint[i].timer <= diff) { uint32 nextBanner = GetNextBanner(&nodePoint[i], nodePoint[i].faction, true); nodePoint[i].last_entry = nodePoint[i].gameobject_entry; nodePoint[i].gameobject_entry = nextBanner; // nodePoint[i].faction = the faction should be the same one... GameObject* banner = GetBGObject(nodePoint[i].gameobject_type); if (!banner) // this should never happen return; float cords[4] = {banner->GetPositionX(), banner->GetPositionY(), banner->GetPositionZ(), banner->GetOrientation() }; DelObject(nodePoint[i].gameobject_type); AddObject(nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry, cords[0], cords[1], cords[2], cords[3], 0, 0, 0, 0, RESPAWN_ONE_DAY); GetBGObject(nodePoint[i].gameobject_type)->SetUInt32Value(GAMEOBJECT_FACTION, nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_Factions[1] : BG_IC_Factions[0]); UpdateNodeWorldState(&nodePoint[i]); HandleCapturedNodes(&nodePoint[i], false); SendMessage2ToAll(LANG_BG_IC_TEAM_HAS_TAKEN_NODE, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL, (nodePoint[i].faction == TEAM_ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE), nodePoint[i].string); nodePoint[i].needChange = false; nodePoint[i].timer = BANNER_STATE_CHANGE_TIME; } else nodePoint[i].timer -= diff; } } if (resourceTimer <= diff) { for (uint8 i = 0; i < NODE_TYPE_DOCKS; i++) { if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) { factionReinforcements[nodePoint[i].faction] += 1; RewardHonorToTeam(RESOURCE_HONOR_AMOUNT, nodePoint[i].faction == TEAM_ALLIANCE ? ALLIANCE : HORDE); UpdateWorldState((nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_ALLIANCE_RENFORT : BG_IC_HORDE_RENFORT), factionReinforcements[nodePoint[i].faction]); } } resourceTimer = IC_RESOURCE_TIME; } else resourceTimer -= diff; }
bool ChatHandler::HandleGOSpawn(const char *args, WorldSession *m_session) { std::stringstream sstext; char* pEntryID = strtok((char*)args, " "); if (!pEntryID) return false; uint32 EntryID = atoi(pEntryID); bool Save = false; char* pSave = strtok(NULL, " "); if (pSave) Save = (atoi(pSave)>0?true:false); OUT_DEBUG("Spawning GameObject By Entry '%u'", EntryID); sstext << "Spawning GameObject By Entry '" << EntryID << "'" << '\0'; SystemMessage(m_session, sstext.str().c_str()); GameObject* go = m_session->GetPlayer()->GetMapMgr()->CreateGameObject(EntryID); if(go == NULL) { sstext << "GameObject Info '" << EntryID << "' Not Found" << '\0'; SystemMessage(m_session, sstext.str().c_str()); return true; } Player* chr = m_session->GetPlayer(); uint32 mapid = chr->GetMapId(); float x = chr->GetPositionX(); float y = chr->GetPositionY(); float z = chr->GetPositionZ(); float o = chr->GetOrientation(); go->SetInstanceID(chr->GetInstanceID()); go->CreateFromProto(EntryID,mapid,x,y,z,o,0.0f,0.0f,0.0f,0.0f); go->PushToWorld(m_session->GetPlayer()->GetMapMgr()); // Create spawn instance GOSpawn * gs = new GOSpawn; gs->entry = go->GetEntry(); gs->facing = go->GetOrientation(); gs->faction = go->GetUInt32Value(GAMEOBJECT_FACTION); gs->flags = go->GetUInt32Value(GAMEOBJECT_FLAGS); gs->id = objmgr.GenerateGameObjectSpawnID(); gs->orientation1 = go->GetFloatValue(GAMEOBJECT_ROTATION); gs->orientation2 = go->GetFloatValue(GAMEOBJECT_ROTATION_01); gs->orientation3 = go->GetFloatValue(GAMEOBJECT_ROTATION_02); gs->orientation4 = go->GetFloatValue(GAMEOBJECT_ROTATION_03); gs->scale = go->GetFloatValue(OBJECT_FIELD_SCALE_X); gs->x = go->GetPositionX(); gs->y = go->GetPositionY(); gs->z = go->GetPositionZ(); gs->state = go->GetByte(GAMEOBJECT_BYTES_1, GAMEOBJECT_BYTES_STATE); gs->phase = 1; uint32 cx = m_session->GetPlayer()->GetMapMgr()->GetPosX(m_session->GetPlayer()->GetPositionX()); uint32 cy = m_session->GetPlayer()->GetMapMgr()->GetPosY(m_session->GetPlayer()->GetPositionY()); m_session->GetPlayer()->GetMapMgr()->GetBaseMap()->GetSpawnsListAndCreate(cx,cy)->GOSpawns.push_back(gs); go->m_spawn = gs; if(Save == true) { // If we're saving, create template and add index go->SaveToDB(); } return true; }
void BattlegroundIC::PostUpdateImpl(uint32 diff) { if (GetStatus() != STATUS_IN_PROGRESS) return; if (!doorsClosed) { if (closeFortressDoorsTimer <= diff) { GetBGObject(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01)->RemoveFromWorld(); GetBGObject(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01)->RemoveFromWorld(); GetBGObject(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR02)->RemoveFromWorld(); GetBGObject(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR02)->RemoveFromWorld(); GetBGObject(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR03)->RemoveFromWorld(); GetBGObject(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR03)->RemoveFromWorld(); GetBGObject(BG_IC_GO_ALLIANCE_GATE_1)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); GetBGObject(BG_IC_GO_HORDE_GATE_1)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); GetBGObject(BG_IC_GO_ALLIANCE_GATE_2)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); GetBGObject(BG_IC_GO_HORDE_GATE_2)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); GetBGObject(BG_IC_GO_ALLIANCE_GATE_3)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); GetBGObject(BG_IC_GO_HORDE_GATE_3)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); doorsClosed = true; } else closeFortressDoorsTimer -= diff; } for (uint8 i = NODE_TYPE_REFINERY; i < MAX_NODE_TYPES; ++i) { if (nodePoint[i].nodeType == NODE_TYPE_DOCKS) { if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) { if (nodePoint[i].timer <= diff) { // we need to confirm this, i am not sure if this every 3 minutes for (uint8 j = 0; j < MAX_CATAPULTS_SPAWNS_PER_FACTION; ++j) { uint8 type = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_A : BG_IC_NPC_CATAPULT_1_H)+j; if (Creature* catapult = GetBGCreature(type)) if (!catapult->IsAlive()) { // Check if creature respawn time is properly saved RespawnMap::iterator itr = respawnMap.find(catapult->GetGUIDLow()); if (itr == respawnMap.end() || time(NULL) < itr->second) continue; catapult->Relocate(BG_IC_DocksVehiclesCatapults[j].GetPositionX(), BG_IC_DocksVehiclesCatapults[j].GetPositionY(), BG_IC_DocksVehiclesCatapults[j].GetPositionZ(), BG_IC_DocksVehiclesCatapults[j].GetOrientation()); catapult->Respawn(true); respawnMap.erase(itr); } } // we need to confirm this is blizzlike, not sure if it is every 3 minutes for (uint8 j = 0; j < MAX_GLAIVE_THROWERS_SPAWNS_PER_FACTION; ++j) { uint8 type = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_A : BG_IC_NPC_GLAIVE_THROWER_1_H)+j; if (Creature* glaiveThrower = GetBGCreature(type)) if (!glaiveThrower->IsAlive()) { // Check if creature respawn time is properly saved RespawnMap::iterator itr = respawnMap.find(glaiveThrower->GetGUIDLow()); if (itr == respawnMap.end() || time(NULL) < itr->second) continue; glaiveThrower->Relocate(BG_IC_DocksVehiclesGlaives[j].GetPositionX(), BG_IC_DocksVehiclesGlaives[j].GetPositionY(), BG_IC_DocksVehiclesGlaives[j].GetPositionZ(), BG_IC_DocksVehiclesGlaives[j].GetOrientation()); glaiveThrower->Respawn(true); respawnMap.erase(itr); } } docksTimer = DOCKS_UPDATE_TIME; } else nodePoint[i].timer -= diff; } } if (nodePoint[i].nodeType == NODE_TYPE_WORKSHOP) { if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) { if (siegeEngineWorkshopTimer <= diff) { uint8 siegeType = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_A : BG_IC_NPC_SIEGE_ENGINE_H); if (Creature* siege = GetBGCreature(siegeType)) // this always should be true if (!siege->IsAlive()) { // Check if creature respawn time is properly saved RespawnMap::iterator itr = respawnMap.find(siege->GetGUIDLow()); if (itr == respawnMap.end() || time(NULL) < itr->second) continue; siege->Relocate(BG_IC_WorkshopVehicles[4].GetPositionX(), BG_IC_WorkshopVehicles[4].GetPositionY(), BG_IC_WorkshopVehicles[4].GetPositionZ(), BG_IC_WorkshopVehicles[4].GetOrientation()); siege->Respawn(true); respawnMap.erase(itr); } // we need to confirm this, i am not sure if this every 3 minutes for (uint8 u = 0; u < MAX_DEMOLISHERS_SPAWNS_PER_FACTION; ++u) { uint8 type = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_A : BG_IC_NPC_DEMOLISHER_1_H)+u; if (Creature* demolisher = GetBGCreature(type)) if (!demolisher->IsAlive()) { // Check if creature respawn time is properly saved RespawnMap::iterator itr = respawnMap.find(demolisher->GetGUIDLow()); if (itr == respawnMap.end() || time(NULL) < itr->second) continue; demolisher->Relocate(BG_IC_WorkshopVehicles[u].GetPositionX(), BG_IC_WorkshopVehicles[u].GetPositionY(), BG_IC_WorkshopVehicles[u].GetPositionZ(), BG_IC_WorkshopVehicles[u].GetOrientation()); demolisher->Respawn(true); respawnMap.erase(itr); } } siegeEngineWorkshopTimer = WORKSHOP_UPDATE_TIME; } else siegeEngineWorkshopTimer -= diff; } } // the point is waiting for a change on its banner if (nodePoint[i].needChange) { if (nodePoint[i].timer <= diff) { uint32 nextBanner = GetNextBanner(&nodePoint[i], nodePoint[i].faction, true); nodePoint[i].last_entry = nodePoint[i].gameobject_entry; nodePoint[i].gameobject_entry = nextBanner; // nodePoint[i].faction = the faction should be the same one... GameObject* banner = GetBGObject(nodePoint[i].gameobject_type); if (!banner) // this should never happen return; float cords[4] = {banner->GetPositionX(), banner->GetPositionY(), banner->GetPositionZ(), banner->GetOrientation() }; DelObject(nodePoint[i].gameobject_type); AddObject(nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry, cords[0], cords[1], cords[2], cords[3], 0, 0, 0, 0, RESPAWN_ONE_DAY); GetBGObject(nodePoint[i].gameobject_type)->SetUInt32Value(GAMEOBJECT_FACTION, nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_Factions[1] : BG_IC_Factions[0]); UpdateNodeWorldState(&nodePoint[i]); HandleCapturedNodes(&nodePoint[i], false); SendMessage2ToAll(LANG_BG_IC_TEAM_HAS_TAKEN_NODE, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL, (nodePoint[i].faction == TEAM_ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE), nodePoint[i].string); nodePoint[i].needChange = false; nodePoint[i].timer = BANNER_STATE_CHANGE_TIME; } else nodePoint[i].timer -= diff; } } if (resourceTimer <= diff) { for (uint8 i = 0; i < NODE_TYPE_DOCKS; ++i) { if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) { factionReinforcements[nodePoint[i].faction] += 1; RewardHonorToTeam(RESOURCE_HONOR_AMOUNT, nodePoint[i].faction); UpdateWorldState((nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_ALLIANCE_RENFORT : BG_IC_HORDE_RENFORT), factionReinforcements[nodePoint[i].faction]); } } resourceTimer = IC_RESOURCE_TIME; } else resourceTimer -= diff; }
void AlteracValley::EventCaptureBase(Player *src,uint32 bannerslot) { if(!gcbanner[bannerslot]) return; /*uint64 guid = src->GetGUID(); std::map<uint64, BattlegroundScore>::iterator itr = m_PlayerScores.find(guid); if(itr == m_PlayerScores.end()) { SendMessageToPlayer(src, "INTERNAL ERROR: Could not find in internal player score map!", true); return; } itr->second.FlagCaptures++; UpdatePVPData();*/ //uint32 rbasesfield = src->m_bgTeam ? AB_HORDE_CAPTUREBASE : AB_ALLIANCE_CAPTUREBASE; uint32 goentry = 0; if(bannerslot < 6) // outside flags are diferent goentry = src->m_bgTeam ? 178393:178389; else goentry = src->m_bgTeam ? 178946:178935; GameObject *pcbanner = src->GetCurrentBattleground()->SpawnGameObject(goentry, 30, gcbanner[bannerslot]->GetPositionX(), gcbanner[bannerslot]->GetPositionY(), gcbanner[bannerslot]->GetPositionZ(), gcbanner[bannerslot]->GetOrientation(), 32, src->m_bgTeam ?84:83, 1); pcbanner->SetFloatValue(GAMEOBJECT_ROTATION_02,gcbanner[bannerslot]->GetFloatValue(GAMEOBJECT_ROTATION_02)); pcbanner->SetFloatValue(GAMEOBJECT_ROTATION_03,gcbanner[bannerslot]->GetFloatValue(GAMEOBJECT_ROTATION_03)); pcbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pcbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pcbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pcbanner->AddToWorld(); if(pcbanner->GetInfo()->sound3) { pcbanner->pcbannerAura = src->GetCurrentBattleground()->SpawnGameObject(pcbanner->GetInfo()->sound3, 30, pcbanner->GetPositionX(), pcbanner->GetPositionY(), pcbanner->GetPositionZ(), pcbanner->GetOrientation(), 32, 114, 5); pcbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_02,pcbanner->GetFloatValue(GAMEOBJECT_ROTATION_02)); pcbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_03,pcbanner->GetFloatValue(GAMEOBJECT_ROTATION_03)); pcbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_STATE, 1); pcbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_TYPE_ID, 6); pcbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pcbanner->pcbannerAura->AddToWorld(); } if(gcbanner[bannerslot]->pcbannerAura) { if( gcbanner[bannerslot]->pcbannerAura->IsInWorld() ) gcbanner[bannerslot]->pcbannerAura->RemoveFromWorld(); delete gcbanner[bannerslot]->pcbannerAura; } if( gcbanner[bannerslot]->IsInWorld() ) gcbanner[bannerslot]->RemoveFromWorld(); delete gcbanner[bannerslot]; gcbanner[bannerslot] = NULL; // Play sound WorldPacket pkt; pkt.Initialize(SMSG_PLAY_SOUND); pkt << uint32(src->m_bgTeam ? SOUND_HORDE_CAPTURE : SOUND_ALLIANCE_CAPTURE); SendPacketToAll(&pkt); char message[300]; static char *resnames[11] = {"Frostworlf Gravyard","Iceblood Graveyard","Stormpike Gravyard", "Stoneheart gravyard","Relief Hunt","Stormpike Aid Station", "Iceblood Tower","Stoneheart Bunker","Icewing Bunker", "Stormpike North Bunker","Stormpike South Bunker"}; snprintf(message, 300, "The %s has taken the %s!", src->m_bgTeam ? "Horde" : "Alliance" , resnames[bannerslot] ); WorldPacket *data = BuildMessageChat(src->m_bgTeam ? 0x54:0x53, 0x27, message, 0); SendPacketToAll(data); delete data; }
void AlteracValley::SpawnBattleground() { // Alliance Gate /*GameObject *gate = SpawnGameObject(180255, 529, 1284.597290, 1281.166626, -15.977916, 0.706859, 32, 114, 1.5799990); gate->SetFloatValue(GAMEOBJECT_ROTATION,0.0129570); gate->SetFloatValue(GAMEOBJECT_ROTATION_01,-0.0602880); gate->SetFloatValue(GAMEOBJECT_ROTATION_02,0.3449600); gate->SetFloatValue(GAMEOBJECT_ROTATION_03,0.9365900); m_Gates.insert(gate); // Horde Gate gate = SpawnGameObject(180256, 529, 708.0902710, 708.4479370, -17.3898964, -2.3910990, 32, 114, 1.5699990); gate->SetFloatValue(GAMEOBJECT_ROTATION,0.0502910); gate->SetFloatValue(GAMEOBJECT_ROTATION_01,0.0151270); gate->SetFloatValue(GAMEOBJECT_ROTATION_02,0.9292169); gate->SetFloatValue(GAMEOBJECT_ROTATION_03,-0.3657840); m_Gates.insert(gate);*/ // -- Places Banners -- // Frostworlf gravyard GameObject *pbanner = SpawnGameObject(178393 ,30 ,-1083.244385 ,-345.994507 ,55.124435 ,4.596910, 32, 84, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); if(pbanner->GetInfo()->sound3) { pbanner->pcbannerAura = SpawnGameObject(pbanner->GetInfo()->sound3, 30, pbanner->GetPositionX(), pbanner->GetPositionY(), pbanner->GetPositionZ(), pbanner->GetOrientation(), 32, 114, 5); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_02,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_02)); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_03,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_03)); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_TYPE_ID, 6); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->pcbannerAura->AddToWorld(); } pbanner->bannerslot = 0; // Iceblood graveyard pbanner = SpawnGameObject(178393, 30 ,-612.329285 ,-396.660095 ,60.858463 ,2.916166, 32, 84, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); if(pbanner->GetInfo()->sound3) { pbanner->pcbannerAura = SpawnGameObject(pbanner->GetInfo()->sound3, 30, pbanner->GetPositionX(), pbanner->GetPositionY(), pbanner->GetPositionZ(), pbanner->GetOrientation(), 32, 114, 5); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_02,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_02)); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_03,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_03)); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_TYPE_ID, 6); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->pcbannerAura->AddToWorld(); } pbanner->bannerslot = 1; // Stormpike gravyard pbanner = SpawnGameObject(178389, 30 ,669.968567 ,-293.467468 ,30.283821 ,3.152932, 32, 83, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); if(pbanner->GetInfo()->sound3) { pbanner->pcbannerAura = SpawnGameObject(pbanner->GetInfo()->sound3, 30, pbanner->GetPositionX(), pbanner->GetPositionY(), pbanner->GetPositionZ(), pbanner->GetOrientation(), 32, 114, 5); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_02,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_02)); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_03,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_03)); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_TYPE_ID, 6); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->pcbannerAura->AddToWorld(); } pbanner->bannerslot = 2; // Stoneheart gravyard pbanner = SpawnGameObject(178389, 30 ,78.205989 ,-405.1715 ,47.11583 ,1.535766, 32, 83, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); if(pbanner->GetInfo()->sound3) { pbanner->pcbannerAura = SpawnGameObject(pbanner->GetInfo()->sound3, 30, pbanner->GetPositionX(), pbanner->GetPositionY(), pbanner->GetPositionZ(), pbanner->GetOrientation(), 32, 114, 5); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_02,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_02)); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_03,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_03)); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_TYPE_ID, 6); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->pcbannerAura->AddToWorld(); } pbanner->bannerslot = 3; // Relief hunt pbanner = SpawnGameObject(178393, 30 ,-1403.875000 ,-309.393738 ,89.372269 ,0.204413, 32, 84, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); if(pbanner->GetInfo()->sound3) { pbanner->pcbannerAura = SpawnGameObject(pbanner->GetInfo()->sound3, 30, pbanner->GetPositionX(), pbanner->GetPositionY(), pbanner->GetPositionZ(), pbanner->GetOrientation(), 32, 114, 5); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_02,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_02)); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_03,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_03)); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_TYPE_ID, 6); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->pcbannerAura->AddToWorld(); } pbanner->bannerslot = 4; // Stormpike aid station pbanner = SpawnGameObject(178389, 30 ,639.348206 ,-31.571268 ,46.222248 ,4.638909, 32, 83, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); if(pbanner->GetInfo()->sound3) { pbanner->pcbannerAura = SpawnGameObject(pbanner->GetInfo()->sound3, 30, pbanner->GetPositionX(), pbanner->GetPositionY(), pbanner->GetPositionZ(), pbanner->GetOrientation(), 32, 114, 5); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_02,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_02)); pbanner->pcbannerAura->SetFloatValue(GAMEOBJECT_ROTATION_03,pbanner->GetFloatValue(GAMEOBJECT_ROTATION_03)); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_TYPE_ID, 6); pbanner->pcbannerAura->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->pcbannerAura->AddToWorld(); } pbanner->bannerslot = 5; // iceblood tower pbanner = SpawnGameObject(178946, 30 ,-571.080994 ,-263.751007 ,75.092003 ,5.410520, 32, 84, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); pbanner->bannerslot = 6; // Stoneheart bunker pbanner = SpawnGameObject(178935, 30 ,-149.734329 ,-441.907593 ,40.386887 ,4.147903, 32, 83, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); pbanner->bannerslot = 7; // Icewing bunker pbanner = SpawnGameObject(178935, 30 ,204.959793 ,-357.945190 ,56.377651 ,5.133710, 32, 83, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); pbanner->bannerslot = 8; // stormpike north bunker pbanner = SpawnGameObject(178935, 30 ,670.908020 ,-142.491776 ,63.662659 ,0.876855, 32, 83, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); pbanner->bannerslot = 9; // stormpike south bunker pbanner = SpawnGameObject(178935, 30 ,555.507324 ,-76.193176 ,51.934444 ,4.996268, 32, 83, 1); pbanner->SetUInt32Value(GAMEOBJECT_STATE, 1); pbanner->SetUInt32Value(GAMEOBJECT_TYPE_ID, 1); pbanner->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); pbanner->AddToWorld(); pbanner->bannerslot = 10; bSpawned = true; }
bool ChatHandler::HandleGOSpawn(const char *args, WorldSession *m_session) { if(!args) return false; char* pEntryID = strtok((char*)args, " "); if (!pEntryID) return false; uint32 EntryID = atoi(pEntryID); if((GameObjectNameStorage.LookupEntry(EntryID) == NULL) || (objmgr.SQLCheckExists("gameobject_names", "entry", EntryID) == NULL)) { RedSystemMessage(m_session, "Invalid Gameobject ID(%u).", EntryID); return true; } bool Save = m_session->HasGMPermissions() ? true : false; char* pSave = strtok(NULL, " "); if(pSave) Save = (atoi(pSave) > 0 ? true : false); GameObject* go = m_session->GetPlayer()->GetMapMgr()->CreateGameObject(EntryID); if(go == NULL) { RedSystemMessage(m_session, "Spawn of Gameobject(%u) failed.", EntryID); return true; } go->Init(); Player* chr = m_session->GetPlayer(); uint32 mapid = chr->GetMapId(); float x = chr->GetPositionX(); float y = chr->GetPositionY(); float z = chr->GetPositionZ(); float o = chr->GetOrientation(); go->CreateFromProto(EntryID,mapid,x,y,z,o); BlueSystemMessage(m_session, "Spawning Gameobject(%u) at current position", EntryID); if(Save == true) // If we're saving, create template and add index { // Create spawn instance GOSpawn *gs = new GOSpawn; gs->entry = go->GetEntry(); gs->facing = go->GetOrientation(); gs->faction = go->GetUInt32Value(GAMEOBJECT_FACTION); gs->flags = go->GetUInt32Value(GAMEOBJECT_FLAGS); gs->id = objmgr.GenerateGameObjectSpawnID(); gs->scale = go->GetFloatValue(OBJECT_FIELD_SCALE_X); gs->x = x; gs->y = y; gs->z = z; gs->state = go->GetByte(GAMEOBJECT_BYTES_1, GAMEOBJECT_BYTES_STATE); gs->phase = chr->GetPhaseMask(); go->Load(gs); go->SaveToDB(); uint32 cx = chr->GetMapMgr()->GetPosX(x); uint32 cy = chr->GetMapMgr()->GetPosY(y); chr->GetMapMgr()->AddGoSpawn(cx, cy, gs); } go->SetPhaseMask(chr->GetPhaseMask()); go->SetInstanceID(chr->GetInstanceID()); go->PushToWorld(m_session->GetPlayer()->GetMapMgr()); sWorld.LogGM(m_session, "Spawned gameobject %u at %f %f %f (%s)", EntryID, x, y, z, Save ? "Saved" : "Not Saved"); 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); }
bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const & /*targets*/) override { GameObject* go = nullptr; for (uint8 i = 0; i < CaribouTrapsNum; ++i) { go = player->FindNearestGameObject(CaribouTraps[i], 5.0f); if (go) break; } if (!go) return false; if (go->FindNearestCreature(NPC_NESINGWARY_TRAPPER, 10.0f, true) || go->FindNearestCreature(NPC_NESINGWARY_TRAPPER, 10.0f, false) || go->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 2.0f)) return true; float x, y, z; go->GetClosePoint(x, y, z, go->GetCombatReach() / 3, 7.0f); go->SummonGameObject(GO_HIGH_QUALITY_FUR, *go, QuaternionData(), 1); if (TempSummon* summon = player->SummonCreature(NPC_NESINGWARY_TRAPPER, x, y, z, go->GetOrientation(), TEMPSUMMON_DEAD_DESPAWN, 1000)) { summon->SetVisible(false); summon->SetReactState(REACT_PASSIVE); summon->SetImmuneToPC(true); } return false; }
bool ChatHandler::HandleGOSpawn(const char *args, WorldSession *m_session) { std::stringstream sstext; char* pEntryID = strtok((char*)args, " "); if (!pEntryID) return false; uint32 EntryID = atoi(pEntryID); bool Save = false; char* pSave = strtok(NULL, " "); if (pSave) Save = (atoi(pSave)>0?true:false); GameObjectInfo* goi = GameObjectNameStorage.LookupEntry(EntryID); if(!goi) { sstext << "GameObject Info '" << EntryID << "' Not Found" << '\0'; SystemMessage(m_session, sstext.str().c_str()); return true; } sLog.outDebug("Spawning GameObject By Entry '%u'", EntryID); sstext << "Spawning GameObject By Entry '" << EntryID << "'" << '\0'; SystemMessage(m_session, sstext.str().c_str()); GameObject *go = m_session->GetPlayer()->GetMapMgr()->CreateGameObject(EntryID); Player *chr = m_session->GetPlayer(); uint32 mapid = chr->GetMapId(); float x = chr->GetPositionX(); float y = chr->GetPositionY(); float z = chr->GetPositionZ(); float o = chr->GetOrientation(); go->SetInstanceID(chr->GetInstanceID()); go->CreateFromProto(EntryID,mapid,x,y,z,o); /* f**k blizz coordinate system */ go->SetFloatValue(GAMEOBJECT_ROTATION_02, sinf(o / 2)); go->SetFloatValue(GAMEOBJECT_ROTATION_03, cosf(o / 2)); go->PushToWorld(m_session->GetPlayer()->GetMapMgr()); // Create sapwn instance GOSpawn * gs = new GOSpawn; gs->entry = go->GetEntry(); gs->facing = go->GetOrientation(); gs->faction = go->GetUInt32Value(GAMEOBJECT_FACTION); gs->flags = go->GetUInt32Value(GAMEOBJECT_FLAGS); gs->id = objmgr.GenerateGameObjectSpawnID(); gs->o = go->GetFloatValue(GAMEOBJECT_ROTATION); gs->o1 = go->GetFloatValue(GAMEOBJECT_ROTATION_01); gs->o2 = go->GetFloatValue(GAMEOBJECT_ROTATION_02); gs->o3 = go->GetFloatValue(GAMEOBJECT_ROTATION_03); gs->scale = go->GetFloatValue(OBJECT_FIELD_SCALE_X); gs->x = go->GetPositionX(); gs->y = go->GetPositionY(); gs->z = go->GetPositionZ(); gs->state = go->GetUInt32Value(GAMEOBJECT_STATE); //gs->stateNpcLink = 0; uint32 cx = m_session->GetPlayer()->GetMapMgr()->GetPosX(m_session->GetPlayer()->GetPositionX()); uint32 cy = m_session->GetPlayer()->GetMapMgr()->GetPosY(m_session->GetPlayer()->GetPositionY()); m_session->GetPlayer()->GetMapMgr()->GetBaseMap()->GetSpawnsListAndCreate(cx,cy)->GOSpawns.push_back(gs); go->m_spawn = gs; MapCell * mCell = m_session->GetPlayer()->GetMapMgr()->GetCell( cx, cy ); if( mCell != NULL ) mCell->SetLoaded(); if(Save == true) { // If we're saving, create template and add index go->SaveToDB(); go->m_loadedFromDB = true; } sGMLog.writefromsession( m_session, "spawned gameobject %s, entry %u at %u %f %f %f%s", GameObjectNameStorage.LookupEntry(gs->entry)->Name, gs->entry, m_session->GetPlayer()->GetMapId(), gs->x, gs->y, gs->z, Save ? ", saved in DB" : "" ); return true; }
bool ItemUse_item_pile_fake_furs(Player *pPlayer, Item * /*pItem*/, SpellCastTargets const & /*targets*/) { GameObject *pGo = NULL; for (uint8 i = 0; i < CaribouTrapsNum; ++i) { pGo = pPlayer->FindNearestGameObject(CaribouTraps[i], 5.0f); if (pGo) break; } if (!pGo) return false; if (pGo->FindNearestCreature(NPC_NESINGWARY_TRAPPER, 10.0f, true) || pGo->FindNearestCreature(NPC_NESINGWARY_TRAPPER, 10.0f, false) || pGo->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 2.0f)) return true; float x, y, z; pGo->GetClosePoint(x, y, z, pGo->GetObjectSize() / 3, 7.0f); pGo->SummonGameObject(GO_HIGH_QUALITY_FUR, pGo->GetPositionX(), pGo->GetPositionY(), pGo->GetPositionZ(), 0, 0, 0, 0, 0, 1000); if (TempSummon* summon = pPlayer->SummonCreature(NPC_NESINGWARY_TRAPPER, x, y, z, pGo->GetOrientation(), TEMPSUMMON_DEAD_DESPAWN, 1000)) { summon->SetVisibility(VISIBILITY_OFF); summon->SetReactState(REACT_PASSIVE); summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); } return false; }
//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; }
bool ItemUse_item_pile_fake_furs(Player *pPlayer, Item *pItem, SpellCastTargets const &targets) { GameObject *pGo; if ((pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_1, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_2, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_3, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_4, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_5, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_6, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_7, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_8, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_9, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_10, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_11, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_12, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_13, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_14, 5.0f)) || (pGo = pPlayer->FindNearestGameObject(GO_CARIBOU_TRAP_15, 5.0f))) { if (pGo->FindNearestCreature(NPC_NESINGWARY_TRAPPER, 10.0f, true) || pGo->FindNearestCreature(NPC_NESINGWARY_TRAPPER, 10.0f, false) || pGo->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 2.0f)) return true; float x, y, z; pGo->GetClosePoint(x, y, z, pGo->GetObjectSize() / 3, 7.0f); pGo->SummonGameObject(GO_HIGH_QUALITY_FUR, pGo->GetPositionX(), pGo->GetPositionY(), pGo->GetPositionZ(), 0, 0, 0, 0, 0, 1000); if (TempSummon* summon = pPlayer->SummonCreature(NPC_NESINGWARY_TRAPPER, x, y, z, pGo->GetOrientation(), TEMPSUMMON_DEAD_DESPAWN, 1000)) { summon->SetVisibility(VISIBILITY_OFF); summon->SetReactState(REACT_PASSIVE); summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); } } return false; }
void Update(uint32 diff) { // Spawn the support for the bridge if necessary if (spawnSupport) { if (GameObject* pCollision = instance->GetGameObject(uiCollision)) pCollision->SummonGameObject(192743, pCollision->GetPositionX(), pCollision->GetPositionY(), pCollision->GetPositionZ(), pCollision->GetOrientation(), 0, 0, 0, 0, 0); spawnSupport = false; } // If there is nothing to activate, then return if (!toActivate) return; if (timer < diff) { timer = 0; if (toActivate == uiBridge) { toActivate = 0; GameObject* pBridge = instance->GetGameObject(uiBridge); GameObject* pCollision = instance->GetGameObject( uiCollision); GameObject* pSladRanStatue = instance->GetGameObject( uiSladRanStatue); GameObject* pMoorabiStatue = instance->GetGameObject( uiMoorabiStatue); GameObject* pDrakkariColossusStatue = instance->GetGameObject(uiDrakkariColossusStatue); GameObject* pGalDarahStatue = instance->GetGameObject( uiGalDarahStatue); if (pBridge && pCollision && pSladRanStatue && pMoorabiStatue && pDrakkariColossusStatue && pGalDarahStatue) { pBridge->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); pCollision->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); pSladRanStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); pMoorabiStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); pDrakkariColossusStatue->SetGoState( GO_STATE_ACTIVE_ALTERNATIVE); pGalDarahStatue->SetGoState( GO_STATE_ACTIVE_ALTERNATIVE); // Add the GO that solidifies the bridge so you can walk on it spawnSupport = true; SaveToDB(); } } else { uint32 spell = 0; GameObject* pAltar = NULL; if (toActivate == uiSladRanStatue) { spell = 57071; pAltar = instance->GetGameObject(uiSladRanAltar); } else if (toActivate == uiMoorabiStatue) { spell = 57068; pAltar = instance->GetGameObject(uiMoorabiAltar); } else if (toActivate == uiDrakkariColossusStatue) { spell = 57072; pAltar = instance->GetGameObject( uiDrakkariColossusAltar); } // This is a workaround to make the beam cast properly. The caster should be ID 30298 but since the spells // all are with scripted target for that same ID, it will hit itself. if (pAltar) if (Creature* trigger = pAltar->SummonCreature(18721, pAltar->GetPositionX(), pAltar->GetPositionY(), pAltar->GetPositionZ() + 3, pAltar->GetOrientation(), TEMPSUMMON_CORPSE_DESPAWN, 5000)) { // Set the trigger model to invisible trigger->SetDisplayId(11686); trigger->CastSpell(trigger, spell, false); } if (GameObject* statueGO = instance->GetGameObject(toActivate)) statueGO->SetGoState(GO_STATE_READY); toActivate = 0; if (phase == 3) QueueActivation(uiBridge, 3000); else SaveToDB(); // Don't save in between last statue and bridge turning in case of crash leading to stuck instance } } else timer -= diff; }
//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; }
//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 = NULL; // by DB guid if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow)) object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id); if (!object) { handler->PSendSysMessage(LANGUAGE_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(LANGUAGE_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(LANGUAGE_COMMAND_MOVEOBJMESSAGE, object->GetGUIDLow(), object->GetGOInfo()->name.c_str(), object->GetGUIDLow()); return true; }
void BattlegroundIC::EventPlayerClickedOnFlag(Player* player, GameObject* target_obj) { if (GetStatus() != STATUS_IN_PROGRESS) return; // All the node points are iterated to find the clicked one for (uint8 i = 0; i < MAX_NODE_TYPES; ++i) { if (nodePoint[i].gameobject_entry == target_obj->GetEntry()) { // THIS SHOULD NEEVEER HAPPEN if (nodePoint[i].faction == player->GetTeamId()) return; uint32 nextBanner = GetNextBanner(&nodePoint[i], player->GetTeamId(), false); // we set the new settings of the nodePoint nodePoint[i].faction = player->GetTeamId(); nodePoint[i].last_entry = nodePoint[i].gameobject_entry; nodePoint[i].gameobject_entry = nextBanner; // this is just needed if the next banner is grey if (nodePoint[i].banners[BANNER_A_CONTESTED] == nextBanner || nodePoint[i].banners[BANNER_H_CONTESTED] == nextBanner) { nodePoint[i].timer = BANNER_STATE_CHANGE_TIME; // 1 minute for last change (real faction banner) nodePoint[i].needChange = true; RelocateDeadPlayers(BgCreatures[BG_IC_NPC_SPIRIT_GUIDE_1 + nodePoint[i].nodeType - 2]); // if we are here means that the point has been lost, or it is the first capture if (nodePoint[i].nodeType != NODE_TYPE_REFINERY && nodePoint[i].nodeType != NODE_TYPE_QUARRY) if (!BgCreatures[BG_IC_NPC_SPIRIT_GUIDE_1 + (nodePoint[i].nodeType) - 2].IsEmpty()) DelCreature(BG_IC_NPC_SPIRIT_GUIDE_1 + (nodePoint[i].nodeType) - 2); UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); if (nodePoint[i].faction == TEAM_ALLIANCE) SendBroadcastText(ICNodes[i].TextAssaulted, CHAT_MSG_BG_SYSTEM_ALLIANCE, player); else SendBroadcastText(ICNodes[i].TextAssaulted, CHAT_MSG_BG_SYSTEM_HORDE, player); HandleContestedNodes(&nodePoint[i]); } else if (nextBanner == nodePoint[i].banners[BANNER_A_CONTROLLED] || nextBanner == nodePoint[i].banners[BANNER_H_CONTROLLED]) // if we are going to spawn the definitve faction banner, we dont need the timer anymore { nodePoint[i].timer = BANNER_STATE_CHANGE_TIME; nodePoint[i].needChange = false; if (nodePoint[i].faction == TEAM_ALLIANCE) SendBroadcastText(ICNodes[i].TextDefended, CHAT_MSG_BG_SYSTEM_ALLIANCE, player); else SendBroadcastText(ICNodes[i].TextDefended, CHAT_MSG_BG_SYSTEM_HORDE, player); HandleCapturedNodes(&nodePoint[i], true); UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); } GameObject* banner = GetBGObject(nodePoint[i].gameobject_type); if (!banner) // this should never happen return; float cords[4] = {banner->GetPositionX(), banner->GetPositionY(), banner->GetPositionZ(), banner->GetOrientation() }; DelObject(nodePoint[i].gameobject_type); if (!AddObject(nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry, cords[0], cords[1], cords[2], cords[3], 0, 0, 0, 0, RESPAWN_ONE_DAY)) { TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning a banner (type: %u, entry: %u). Isle of Conquest BG cancelled.", nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry); EndBattleground(0); } GetBGObject(nodePoint[i].gameobject_type)->SetUInt32Value(GAMEOBJECT_FACTION, nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_Factions[1] : BG_IC_Factions[0]); UpdateNodeWorldState(&nodePoint[i]); // we dont need iterating if we are here // If the needChange bool was set true, we will handle the rest in the Update Map function. return; } } }
void BattlegroundIC::EventPlayerClickedOnFlag(Player* player, GameObject* target_obj) { if (GetStatus() != STATUS_IN_PROGRESS) return; // All the node points are iterated to find the clicked one for (uint8 i = 0; i < MAX_NODE_TYPES; i++) { if (nodePoint[i].gameobject_entry == target_obj->GetEntry()) { // THIS SHOULD NEEVEER HAPPEN if (nodePoint[i].faction == player->GetTeamId()) return; uint32 nextBanner = GetNextBanner(&nodePoint[i], player->GetTeamId(), false); // we set the new settings of the nodePoint nodePoint[i].faction = player->GetTeamId(); nodePoint[i].last_entry = nodePoint[i].gameobject_entry; nodePoint[i].gameobject_entry = nextBanner; // this is just needed if the next banner is grey if (nodePoint[i].banners[BANNER_A_CONTESTED] == nextBanner || nodePoint[i].banners[BANNER_H_CONTESTED] == nextBanner) { nodePoint[i].timer = BANNER_STATE_CHANGE_TIME; // 1 minute for last change (real faction banner) nodePoint[i].needChange = true; RealocatePlayers(nodePoint[i].nodeType); // if we are here means that the point has been lost, or it is the first capture if (nodePoint[i].nodeType != NODE_TYPE_REFINERY && nodePoint[i].nodeType != NODE_TYPE_QUARRY) if (m_BgCreatures[BG_IC_NPC_SPIRIT_GUIDE_1+(nodePoint[i].nodeType)-2]) DelCreature(BG_IC_NPC_SPIRIT_GUIDE_1+(nodePoint[i].nodeType)-2); UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); SendMessage2ToAll(LANG_BG_IC_TEAM_ASSAULTED_NODE_1, CHAT_MSG_BG_SYSTEM_NEUTRAL, player, nodePoint[i].string); SendMessage2ToAll(LANG_BG_IC_TEAM_ASSAULTED_NODE_2, CHAT_MSG_BG_SYSTEM_NEUTRAL, player, nodePoint[i].string, (player->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE)); HandleContestedNodes(&nodePoint[i]); } else if (nextBanner == nodePoint[i].banners[BANNER_A_CONTROLLED] || nextBanner == nodePoint[i].banners[BANNER_H_CONTROLLED]) // if we are going to spawn the definitve faction banner, we dont need the timer anymore { nodePoint[i].timer = BANNER_STATE_CHANGE_TIME; nodePoint[i].needChange = false; SendMessage2ToAll(LANG_BG_IC_TEAM_DEFENDED_NODE, CHAT_MSG_BG_SYSTEM_NEUTRAL, player, nodePoint[i].string); HandleCapturedNodes(&nodePoint[i], true); UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); } GameObject* banner = GetBGObject(nodePoint[i].gameobject_type); if (!banner) // this should never happen return; float cords[4] = {banner->GetPositionX(), banner->GetPositionY(), banner->GetPositionZ(), banner->GetOrientation() }; DelObject(nodePoint[i].gameobject_type); AddObject(nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry, cords[0], cords[1], cords[2], cords[3], 0, 0, 0, 0, RESPAWN_ONE_DAY); GetBGObject(nodePoint[i].gameobject_type)->SetUInt32Value(GAMEOBJECT_FACTION, nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_Factions[1] : BG_IC_Factions[0]); if (nodePoint[i].nodeType == NODE_TYPE_WORKSHOP) { DelObject(BG_IC_GO_SEAFORIUM_BOMBS_1); DelObject(BG_IC_GO_SEAFORIUM_BOMBS_2); } UpdateNodeWorldState(&nodePoint[i]); // we dont need iterating if we are here // If the needChange bool was set true, we will handle the rest in the Update Map function. return; } } }
int LuaGlobalFunctions_PerformIngameSpawn(lua_State * L) { uint32 spawntype = luaL_checkint(L, 1); uint32 entry = luaL_checkint(L, 2); uint32 map = luaL_checkint(L, 3); float x = CHECK_FLOAT(L, 4); float y = CHECK_FLOAT(L, 5); float z = CHECK_FLOAT(L, 6); float o = CHECK_FLOAT(L, 7); uint32 faction = luaL_checkint(L, 8); //also scale as percentage uint32 duration = luaL_checkint(L, 9); uint32 equip1 = luaL_optint(L, 10, 1); uint32 equip2 = luaL_optint(L, 11, 1); uint32 equip3 = luaL_optint(L, 12, 1); //13: instance id uint32 save = luaL_optint(L, 14, 0); if(x && y && z && entry) { if (spawntype == 1) //Unit { CreatureProto *p = CreatureProtoStorage.LookupEntry(entry); CreatureInfo *i = CreatureNameStorage.LookupEntry(entry); if (p == NULL || i == NULL) RET_NIL(true); MapMgr *mapMgr = sInstanceMgr.GetMapMgr(map); if (mapMgr == NULL) RET_NIL(true); int32 instanceid = luaL_optint(L, 13, mapMgr->GetInstanceID()); CreatureSpawn * sp = new CreatureSpawn(); sp->entry = entry; sp->id = objmgr.GenerateCreatureSpawnID(); sp->x = x; sp->y = y; sp->z = z; sp->o = o; sp->emote_state = 0; sp->flags = 0; sp->factionid = faction; sp->stand_state = 0; sp->phase = 1; sp->vehicle = p->vehicle_entry > 0 ? true : false; sp->Bytes = NULL; sp->ChannelData = NULL; sp->MountedDisplay = NULL; Creature * pCreature = NULL; if(sp->vehicle) { pCreature = TO_CREATURE(mapMgr->CreateVehicle(entry)); TO_VEHICLE(pCreature)->Load(sp, mapMgr->iInstanceMode, NULL); } else { pCreature = mapMgr->CreateCreature(entry); pCreature->Load(sp, mapMgr->iInstanceMode, NULL); } pCreature->m_loadedFromDB = true; pCreature->SetFaction(faction); pCreature->SetInstanceID(instanceid); pCreature->SetMapId(map); pCreature->m_noRespawn = true; pCreature->PushToWorld(mapMgr); if (duration>0) pCreature->Despawn(duration,0); if (save) pCreature->SaveToDB(); Lunar<Unit>::push(L,TO_UNIT(pCreature)); } else if (spawntype == 2) //GO { GameObjectInfo *n = GameObjectNameStorage.LookupEntry(entry); if (n == NULL) RET_NIL(true); MapMgr *mapMgr = sInstanceMgr.GetMapMgr(map); if (mapMgr == NULL) RET_NIL(true); int32 instanceid = luaL_optint(L, 13, mapMgr->GetInstanceID()); GameObject *go = mapMgr->CreateGameObject(entry); go->SetInstanceID(instanceid); go->CreateFromProto(entry,map,x,y,z,o); // Create spawn instance GOSpawn * gs = new GOSpawn; gs->entry = go->GetEntry(); gs->facing = go->GetOrientation(); gs->faction = go->GetFaction(); gs->flags = go->GetUInt32Value(GAMEOBJECT_FLAGS); gs->id = objmgr.GenerateGameObjectSpawnID(); gs->scale = go->GetUInt32Value(OBJECT_FIELD_SCALE_X); gs->x = go->GetPositionX(); gs->y = go->GetPositionY(); gs->z = go->GetPositionZ(); gs->state = go->GetByte(GAMEOBJECT_BYTES_1, 0); gs->phase = 0; go->m_spawn = gs; go->PushToWorld(mapMgr); if (duration) sEventMgr.AddEvent(go,&GameObject::ExpireAndDelete,EVENT_GAMEOBJECT_UPDATE,duration,1,EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); if (save) go->SaveToDB(); Lunar<GameObject>::push(L,go); } else RET_NIL(true); } else RET_NIL(true); return 1; }