本文整理汇总了C++中GetMap函数的典型用法代码示例。如果您正苦于以下问题:C++ GetMap函数的具体用法?C++ GetMap怎么用?C++ GetMap使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了GetMap函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: cell
void MapManager::LoadGrid(int mapid, float x, float y, const WorldObject* obj, bool no_unload)
{
CellPair p = MaNGOS::ComputeCellPair(x,y);
Cell cell(p);
GetMap(mapid, obj)->LoadGrid(cell,no_unload);
}
开发者ID:Artea,项目名称:mangos-svn,代码行数:6,代码来源:MapManager.cpp
示例2: SetMap
bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, uint32 spellXSpellVisualId, ObjectGuid const& castId, AuraEffect const* aurEff)
{
_targetGuid = target ? target->GetGUID() : ObjectGuid::Empty;
_aurEff = aurEff;
SetMap(caster->GetMap());
Relocate(pos);
if (!IsPositionValid())
{
TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (spellMiscId %u) not created. Invalid coordinates (X: %f Y: %f)", spellMiscId, GetPositionX(), GetPositionY());
return false;
}
_areaTriggerMiscTemplate = sAreaTriggerDataStore->GetAreaTriggerMiscTemplate(spellMiscId);
if (!_areaTriggerMiscTemplate)
{
TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (spellMiscId %u) not created. Invalid areatrigger miscid (%u)", spellMiscId, spellMiscId);
return false;
}
Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), GetTemplate()->Id, caster->GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>()));
SetEntry(GetTemplate()->Id);
SetDuration(duration);
SetObjectScale(1.0f);
SetGuidValue(AREATRIGGER_CASTER, caster->GetGUID());
SetGuidValue(AREATRIGGER_CREATING_EFFECT_GUID, castId);
SetUInt32Value(AREATRIGGER_SPELLID, spell->Id);
SetUInt32Value(AREATRIGGER_SPELL_FOR_VISUALS, spell->Id);
SetUInt32Value(AREATRIGGER_SPELL_X_SPELL_VISUAL_ID, spellXSpellVisualId);
SetUInt32Value(AREATRIGGER_TIME_TO_TARGET_SCALE, GetMiscTemplate()->TimeToTargetScale != 0 ? GetMiscTemplate()->TimeToTargetScale : GetUInt32Value(AREATRIGGER_DURATION));
SetFloatValue(AREATRIGGER_BOUNDS_RADIUS_2D, GetTemplate()->MaxSearchRadius);
SetUInt32Value(AREATRIGGER_DECAL_PROPERTIES_ID, GetMiscTemplate()->DecalPropertiesId);
for (uint8 scaleCurveIndex = 0; scaleCurveIndex < MAX_AREATRIGGER_SCALE; ++scaleCurveIndex)
if (GetMiscTemplate()->ExtraScale.Data.Raw[scaleCurveIndex])
SetUInt32Value(AREATRIGGER_EXTRA_SCALE_CURVE + scaleCurveIndex, GetMiscTemplate()->ExtraScale.Data.Raw[scaleCurveIndex]);
PhasingHandler::InheritPhaseShift(this, caster);
if (target && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED))
{
m_movementInfo.transport.guid = target->GetGUID();
}
UpdateShape();
uint32 timeToTarget = GetMiscTemplate()->TimeToTarget != 0 ? GetMiscTemplate()->TimeToTarget : GetUInt32Value(AREATRIGGER_DURATION);
if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT))
{
AreaTriggerCircularMovementInfo cmi = GetMiscTemplate()->CircularMovementInfo;
if (target && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED))
cmi.PathTarget = target->GetGUID();
else
cmi.Center = pos;
InitCircularMovement(cmi, timeToTarget);
}
else if (GetMiscTemplate()->HasSplines())
{
InitSplineOffsets(GetMiscTemplate()->SplinePoints, timeToTarget);
}
// movement on transport of areatriggers on unit is handled by themself
Transport* transport = m_movementInfo.transport.guid.IsEmpty() ? caster->GetTransport() : nullptr;
if (transport)
{
float x, y, z, o;
pos.GetPosition(x, y, z, o);
transport->CalculatePassengerOffset(x, y, z, &o);
m_movementInfo.transport.pos.Relocate(x, y, z, o);
// This object must be added to transport before adding to map for the client to properly display it
transport->AddPassenger(this);
}
AI_Initialize();
// Relocate areatriggers with circular movement again
if (HasCircularMovement())
Relocate(CalculateCircularMovementPosition());
if (!GetMap()->AddToMap(this))
{
// Returning false will cause the object to be deleted - remove from transport
if (transport)
transport->RemovePassenger(this);
return false;
}
caster->_RegisterAreaTrigger(this);
_ai->OnCreate();
return true;
}
开发者ID:Rochet2,项目名称:TrinityCore,代码行数:100,代码来源:AreaTrigger.cpp
示例3: result
void CUser::SelectCharacter(Packet & pkt)
{
Packet result(WIZ_SEL_CHAR);
uint8 bResult, bInit;
if (isBanned())
{
Disconnect();
return;
}
pkt >> bResult >> bInit;
result << bResult;
if (bResult == 0 || !GetZoneID())
goto fail_return;
m_pMap = g_pMain->GetZoneByID(GetZoneID());
if (GetMap() == nullptr)
goto fail_return;
if (g_pMain->m_nServerNo != GetMap()->m_nServerNo)
{
_ZONE_SERVERINFO *pInfo = g_pMain->m_ServerArray.GetData(GetMap()->m_nServerNo);
if (pInfo == nullptr)
goto fail_return;
SendServerChange(pInfo->strServerIP, bInit);
return;
}
if (!g_pMain->isWarOpen() && GetFame() == COMMAND_CAPTAIN)
m_bFame = CHIEF;
// Disallow players from relogging in the opposite nation's home zone when an invasion's not running.
if (((GetZoneID() != GetNation() && GetZoneID() <= ZONE_ELMORAD && !g_pMain->m_byBattleOpen)
// also disallow players from logging back into war zones that aren't currently active...
|| (GetMap()->isWarZone() && !g_pMain->m_byBattleOpen)
// Chaos, bdw and juraid montuain
|| isInTempleEventZone()
// Ronark Land, Ardream, RLB, Bifrost, Krowaz Dominion.
|| (g_pMain->m_byBattleOpen && (GetZoneID() == ZONE_RONARK_LAND
|| GetZoneID() == ZONE_ARDREAM
|| GetZoneID() == ZONE_RONARK_LAND_BASE
|| GetZoneID() == ZONE_BIFROST
|| GetZoneID() == ZONE_KROWAZ_DOMINION))) && !isGM())
{
NativeZoneReturn();
Disconnect();
return;
}
SetLogInInfoToDB(bInit);
result << GetZoneID() << GetSPosX() << GetSPosZ() << GetSPosY() << g_pMain->m_byOldVictory;
m_bSelectedCharacter = true;
Send(&result);
SetUserAbility(false);
if (GetLevel() > MAX_LEVEL)
{
Disconnect();
return;
}
m_iMaxExp = g_pMain->GetExpByLevel(GetLevel());
SetRegion(GetNewRegionX(), GetNewRegionZ());
if (GetClanID() == -1)
{
SetClanID(0);
m_bFame = 0;
return;
}
else if (GetClanID() != 0
&& GetZoneID() > 2)
{
result.Initialize(WIZ_KNIGHTS_PROCESS);
result << uint8(KNIGHTS_LIST_REQ) << GetClanID();
g_pMain->AddDatabaseRequest(result, this);
}
return;
fail_return:
Send(&result);
}
开发者ID:sailei1,项目名称:X-ShieldProject,代码行数:87,代码来源:CharacterSelectionHandler.cpp
示例4: GetInstanceId
void DungeonPersistentState::UpdateEncounterState(EncounterCreditType type, uint32 creditEntry)
{
DungeonEncounterMapBounds bounds = sObjectMgr.GetDungeonEncounterBounds(creditEntry);
for (DungeonEncounterMap::const_iterator iter = bounds.first; iter != bounds.second; ++iter)
{
DungeonEncounterEntry const* dbcEntry = iter->second->dbcEntry;
if (iter->second->creditType == type && Difficulty(dbcEntry->Difficulty) == GetDifficulty() && dbcEntry->mapId == GetMapId())
{
m_completedEncountersMask |= 1 << dbcEntry->encounterIndex;
CharacterDatabase.PExecute("UPDATE instance SET encountersMask = '%u' WHERE id = '%u'", m_completedEncountersMask, GetInstanceId());
DEBUG_LOG("DungeonPersistentState: Dungeon %s (Id %u) completed encounter %s", GetMap()->GetMapName(), GetInstanceId(), dbcEntry->encounterName[sWorld.GetDefaultDbcLocale()]);
if (/*uint32 dungeonId =*/ iter->second->lastEncounterDungeon)
{
DEBUG_LOG("DungeonPersistentState:: Dungeon %s (Instance-Id %u) completed last encounter %s", GetMap()->GetMapName(), GetInstanceId(), dbcEntry->encounterName[sWorld.GetDefaultDbcLocale()]);
// Place LFG reward here
}
return;
}
}
}
开发者ID:krullgor,项目名称:mangos-tbc,代码行数:24,代码来源:MapPersistentStateMgr.cpp
示例5: GetMap
bool 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(GetMapId());
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(newMapid);
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++);
float destX, destY, destZ, destO;
obj->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO);
TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, GetOrientation());
switch (obj->GetTypeId())
{
case TYPEID_PLAYER:
if (!obj->ToPlayer()->TeleportTo(newMapid, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT))
_passengers.erase(obj);
break;
default:
RemovePassenger(obj);
break;
}
}
Relocate(x, y, z, GetOrientation());
GetMap()->AddToMap<Transport>(this);
return true;
}
else
{
UpdatePosition(x, y, z, GetOrientation());
return false;
}
}
开发者ID:Caydan,项目名称:WoWSCore548,代码行数:69,代码来源:Transport.cpp
示例6: switch
//.........这里部分代码省略.........
{
case GAMEOBJECT_TYPE_FISHINGNODE: // can't fish now
{
Unit* caster = GetOwner();
if(caster && caster->GetTypeId()==TYPEID_PLAYER)
{
if(caster->m_currentSpells[CURRENT_CHANNELED_SPELL])
{
caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->SendChannelUpdate(0);
caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->finish(false);
}
WorldPacket data(SMSG_FISH_NOT_HOOKED,0);
((Player*)caster)->GetSession()->SendPacket(&data);
}
// can be delete
m_lootState = GO_JUST_DEACTIVATED;
return;
}
case GAMEOBJECT_TYPE_DOOR:
case GAMEOBJECT_TYPE_BUTTON:
//we need to open doors if they are closed (add there another condition if this code breaks some usage, but it need to be here for battlegrounds)
if( !GetGoState() )
SwitchDoorOrButton(false);
//flags in AB are type_button and we need to add them here so no break!
default:
if(!m_spawnedByDefault) // despawn timer
{
// can be despawned or destroyed
SetLootState(GO_JUST_DEACTIVATED);
return;
}
// respawn timer
GetMap()->Add(this);
break;
}
}
}
// traps can have time and can not have
GameObjectInfo const* goInfo = GetGOInfo();
if(goInfo->type == GAMEOBJECT_TYPE_TRAP)
{
// traps
Unit* owner = GetOwner();
Unit* ok = NULL; // pointer to appropriate target if found any
if(m_cooldownTime >= time(NULL))
return;
bool IsBattleGroundTrap = false;
//FIXME: this is activation radius (in different casting radius that must be selected from spell data)
//TODO: move activated state code (cast itself) to GO_ACTIVATED, in this place only check activating and set state
float radius = goInfo->trap.radius;
if(!radius)
{
if(goInfo->trap.cooldown != 3) // cast in other case (at some triggering/linked go/etc explicit call)
return;
else
{
if(m_respawnTime > 0)
break;
radius = goInfo->trap.cooldown; // battlegrounds gameobjects has data2 == 0 && data5 == 3
IsBattleGroundTrap = true;
}
开发者ID:Actionfox,项目名称:mangos,代码行数:67,代码来源:GameObject.cpp
示例7: IsMap
bool EscValue::HasNumberField(const char *id) const
{
return IsMap() && GetMap().Find(id) >= 0;
}
开发者ID:ultimatepp,项目名称:mirror,代码行数:4,代码来源:EscMap.cpp
示例8: GetSkillValue
bool Player::OnSurvey(uint32& entry, float& x, float& y, float& z, float &orientation)
{
entry = 0;
uint16 skill_now = GetSkillValue(SKILL_ARCHAEOLOGY);
if (!skill_now)
return false;
uint16 site_id = GetResearchSiteID();
if (!site_id)
return false;
uint8 i = 0;
for(; i < MAX_RESEARCH_SITES; ++i)
if (GetUInt16Value(PLAYER_FIELD_RESERACH_SITE_1 + i / 2, i % 2) == site_id)
break;
MANGOS_ASSERT(i < MAX_RESEARCH_SITES);
DigSite &site = _digSites[i];
if (site.site_id != site_id)
{
if (!GenerateDigSiteLoot(site_id, site))
return false;
site.site_id = site_id;
}
orientation = GetAngle(site.loot_x, site.loot_y);
float dist_now = GetDistance2d(site.loot_x, site.loot_y);
if (dist_now >= ARCHAEOLOGY_DIG_SITE_FAR_DIST)
{
entry = GO_FAR_SURVEYBOT;
return false;
}
if (dist_now >= ARCHAEOLOGY_DIG_SITE_MED_DIST)
{
entry = GO_MEDIUM_SURVEYBOT;
return false;
}
if (dist_now >= ARCHAEOLOGY_DIG_SITE_FIND_DIST)
{
entry = GO_CLOSE_SURVEYBOT;
return false;
}
if (skill_now < 50)
UpdateSkill(SKILL_ARCHAEOLOGY, 1);
entry = site.find_id;
x = site.loot_x;
y = site.loot_y;
z = GetMap()->GetTerrain()->GetHeightStatic(x, y, GetPositionZ(), true, 5);
if (site.count < 2)
{
++site.count;
if (!GenerateDigSiteLoot(site_id, site))
return true;
}
else
{
site.clear();
UseResearchSite(site_id);
}
_archaeologyChanged = true;
return true;
}
开发者ID:Jojo2323,项目名称:mangos3,代码行数:71,代码来源:Archaeology.cpp
示例9: GMs
void CUser::Chat(Packet & pkt)
{
Packet result;
uint16 sessID;
uint8 type = pkt.read<uint8>(), bNation;
string chatstr, finalstr, strSender, * strMessage;
bool isAnnouncement = false;
if (isMuted())
return;
pkt >> chatstr;
if (chatstr.empty() || chatstr.size() > 128)
return;
// Process GM commands
if (isGM() && ProcessChatCommand(chatstr))
return;
#if 0 // Removed this - all it seems to do is cause chat to break for GMs (is it 19xx+ only?)
if( isGM() && type == GENERAL_CHAT)
type = 0x14;
#endif
// Handle GM notice & announcement commands
if (type == PUBLIC_CHAT || type == ANNOUNCEMENT_CHAT)
{
// Trying to use a GM command without authorisation? Bad player!
if (!isGM())
return;
if (type == ANNOUNCEMENT_CHAT)
type = WAR_SYSTEM_CHAT;
// This is horrible, but we'll live with it for now.
// Pull the notice string (#### NOTICE : %s ####) from the database.
// Format the chat string around it, so our chat data is within the notice
g_pMain->GetServerResource(IDP_ANNOUNCEMENT, &finalstr, chatstr.c_str());
isAnnouncement = true;
}
if (isAnnouncement)
{
// GM notice/announcements show no name, so don't bother setting it.
strMessage = &finalstr; // use the formatted message from the user
bNation = KARUS; // arbitrary nation
sessID = -1;
}
else
{
strMessage = &chatstr; // use the raw message from the user
strSender = GetName(); // everything else uses a name, so set it
bNation = GetNation();
sessID = GetSocketID();
}
ChatPacket::Construct(&result, type, strMessage, &strSender, bNation, sessID);
switch (type)
{
case GENERAL_CHAT:
g_pMain->Send_NearRegion(&result, GetMap(), GetRegionX(), GetRegionZ(), GetX(), GetZ());
break;
case PRIVATE_CHAT:
{
CUser *pUser = g_pMain->GetUserPtr(m_sPrivateChatUser);
if (pUser != nullptr)
pUser->Send(&result);
} break;
case PARTY_CHAT:
if (isInParty())
g_pMain->Send_PartyMember(m_sPartyIndex, &result);
break;
case SHOUT_CHAT:
if (m_sMp < (m_iMaxMp / 5))
break;
// Characters under level 35 require 3,000 coins to shout.
if (!isGM()
&& GetLevel() < 35
&& !GoldLose(SHOUT_COIN_REQUIREMENT))
break;
MSpChange(-(m_iMaxMp / 5));
SendToRegion(&result);
break;
case KNIGHTS_CHAT:
if (isInClan())
g_pMain->Send_KnightsMember(GetClanID(), &result);
break;
case PUBLIC_CHAT:
case ANNOUNCEMENT_CHAT:
if (isGM())
g_pMain->Send_All(&result);
//.........这里部分代码省略.........
开发者ID:Kocu,项目名称:snoxd-koserver,代码行数:101,代码来源:ChatHandler.cpp
示例10: AI
void Transport::Update(uint32 diff)
{
uint32 const positionUpdateDelay = 200;
if (AI())
AI()->UpdateAI(diff);
else if (!AIM_Initialize())
TC_LOG_ERROR("entities.transport", "Could not initialize GameObjectAI for Transport");
if (GetKeyFrames().size() <= 1)
return;
if (IsMoving() || !_pendingStop)
m_goValue.Transport.PathProgress += diff;
uint32 timer = m_goValue.Transport.PathProgress % GetTransportPeriod();
bool justStopped = false;
// Set current waypoint
// Desired outcome: _currentFrame->DepartureTime < timer < _nextFrame->ArriveTime
// ... arrive | ... delay ... | departure
// event / event /
for (;;)
{
if (timer >= _currentFrame->ArriveTime)
{
if (!_triggeredArrivalEvent)
{
DoEventIfAny(*_currentFrame, false);
_triggeredArrivalEvent = true;
}
if (timer < _currentFrame->DepartureTime)
{
SetMoving(false);
justStopped = true;
if (_pendingStop && GetGoState() != GO_STATE_READY)
{
SetGoState(GO_STATE_READY);
m_goValue.Transport.PathProgress = (m_goValue.Transport.PathProgress / GetTransportPeriod());
m_goValue.Transport.PathProgress *= GetTransportPeriod();
m_goValue.Transport.PathProgress += _currentFrame->ArriveTime;
}
break; // its a stop frame and we are waiting
}
}
if (timer >= _currentFrame->DepartureTime && !_triggeredDepartureEvent)
{
DoEventIfAny(*_currentFrame, true); // departure event
_triggeredDepartureEvent = true;
}
// not waiting anymore
SetMoving(true);
// Enable movement
if (GetGOInfo()->moTransport.allowstopping)
SetGoState(GO_STATE_ACTIVE);
if (timer >= _currentFrame->DepartureTime && timer < _currentFrame->NextArriveTime)
break; // found current waypoint
MoveToNextWaypoint();
sScriptMgr->OnRelocate(this, _currentFrame->Node->NodeIndex, _currentFrame->Node->ContinentID, _currentFrame->Node->Loc.X, _currentFrame->Node->Loc.Y, _currentFrame->Node->Loc.Z);
TC_LOG_DEBUG("entities.transport", "Transport %u (%s) moved to node %u %u %f %f %f", GetEntry(), GetName().c_str(), _currentFrame->Node->NodeIndex, _currentFrame->Node->ContinentID, _currentFrame->Node->Loc.X, _currentFrame->Node->Loc.Y, _currentFrame->Node->Loc.Z);
// Departure event
if (_currentFrame->IsTeleportFrame())
if (TeleportTransport(_nextFrame->Node->ContinentID, _nextFrame->Node->Loc.X, _nextFrame->Node->Loc.Y, _nextFrame->Node->Loc.Z, _nextFrame->InitialOrientation))
return; // Update more in new map thread
}
// Add model to map after we are fully done with moving maps
if (_delayedAddModel)
{
_delayedAddModel = false;
if (m_model)
GetMap()->InsertGameObjectModel(*m_model);
}
// Set position
_positionChangeTimer.Update(diff);
if (_positionChangeTimer.Passed())
{
_positionChangeTimer.Reset(positionUpdateDelay);
if (IsMoving())
{
float t = !justStopped ? CalculateSegmentPos(float(timer) * 0.001f) : 1.0f;
G3D::Vector3 pos, dir;
_currentFrame->Spline->evaluate_percent(_currentFrame->Index, t, pos);
_currentFrame->Spline->evaluate_derivative(_currentFrame->Index, t, dir);
UpdatePosition(pos.x, pos.y, pos.z, std::atan2(dir.y, dir.x) + float(M_PI));
}
else if (justStopped)
UpdatePosition(_currentFrame->Node->Loc.X, _currentFrame->Node->Loc.Y, _currentFrame->Node->Loc.Z, _currentFrame->InitialOrientation);
else
{
//.........这里部分代码省略.........
开发者ID:Asandru,项目名称:TrinityCore,代码行数:101,代码来源:Transport.cpp
示例11: switch
void GameObject::Use(Unit* user)
{
// by default spell caster is user
Unit* spellCaster = user;
uint32 spellId = 0;
switch(GetGoType())
{
case GAMEOBJECT_TYPE_DOOR: //0
case GAMEOBJECT_TYPE_BUTTON: //1
//doors/buttons never really despawn, only reset to default state/flags
UseDoorOrButton();
// activate script
sWorld.ScriptsStart(sGameObjectScripts, GetDBTableGUIDLow(), spellCaster, this);
return;
case GAMEOBJECT_TYPE_QUESTGIVER: //2
{
if(user->GetTypeId()!=TYPEID_PLAYER)
return;
Player* player = (Player*)user;
player->PrepareQuestMenu( GetGUID() );
player->SendPreparedQuest( GetGUID() );
return;
}
//Sitting: Wooden bench, chairs enzz
case GAMEOBJECT_TYPE_CHAIR: //7
{
GameObjectInfo const* info = GetGOInfo();
if(!info)
return;
if(user->GetTypeId()!=TYPEID_PLAYER)
return;
Player* player = (Player*)user;
// a chair may have n slots. we have to calculate their positions and teleport the player to the nearest one
// check if the db is sane
if(info->chair.slots > 0)
{
float lowestDist = DEFAULT_VISIBILITY_DISTANCE;
float x_lowest = GetPositionX();
float y_lowest = GetPositionY();
// the object orientation + 1/2 pi
// every slot will be on that straight line
float orthogonalOrientation = GetOrientation()+M_PI*0.5f;
// find nearest slot
for(uint32 i=0; i<info->chair.slots; i++)
{
// the distance between this slot and the center of the go - imagine a 1D space
float relativeDistance = (info->size*i)-(info->size*(info->chair.slots-1)/2.0f);
float x_i = GetPositionX() + relativeDistance * cos(orthogonalOrientation);
float y_i = GetPositionY() + relativeDistance * sin(orthogonalOrientation);
// calculate the distance between the player and this slot
float thisDistance = player->GetDistance2d(x_i, y_i);
/* debug code. It will spawn a npc on each slot to visualize them.
Creature* helper = player->SummonCreature(14496, x_i, y_i, GetPositionZ(), GetOrientation(), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10000);
std::ostringstream output;
output << i << ": thisDist: " << thisDistance;
helper->MonsterSay(output.str().c_str(), LANG_UNIVERSAL, 0);
*/
if(thisDistance <= lowestDist)
{
lowestDist = thisDistance;
x_lowest = x_i;
y_lowest = y_i;
}
}
player->TeleportTo(GetMapId(), x_lowest, y_lowest, GetPositionZ(), GetOrientation(),TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET);
}
else
{
// fallback, will always work
player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(),TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET);
}
player->SetStandState(PLAYER_STATE_SIT_LOW_CHAIR+info->chair.height);
return;
}
//big gun, its a spell/aura
case GAMEOBJECT_TYPE_GOOBER: //10
{
GameObjectInfo const* info = GetGOInfo();
if(user->GetTypeId()==TYPEID_PLAYER)
{
Player* player = (Player*)user;
// show page
if(info->goober.pageId)
//.........这里部分代码省略.........
开发者ID:de-dima,项目名称:243,代码行数:101,代码来源:GameObject.cpp
示例12: Unwind
bool UnwindPtrace::Unwind(size_t num_ignore_frames, ucontext_t* ucontext) {
if (GetMap() == nullptr) {
// Without a map object, we can't do anything.
error_ = BACKTRACE_UNWIND_ERROR_MAP_MISSING;
return false;
}
error_ = BACKTRACE_UNWIND_NO_ERROR;
if (ucontext) {
BACK_LOGW("Unwinding from a specified context not supported yet.");
error_ = BACKTRACE_UNWIND_ERROR_UNSUPPORTED_OPERATION;
return false;
}
if (!Init()) {
return false;
}
unw_cursor_t cursor;
int ret = unw_init_remote(&cursor, addr_space_, upt_info_);
if (ret < 0) {
BACK_LOGW("unw_init_remote failed %d", ret);
error_ = BACKTRACE_UNWIND_ERROR_SETUP_FAILED;
return false;
}
size_t num_frames = 0;
do {
unw_word_t pc;
ret = unw_get_reg(&cursor, UNW_REG_IP, &pc);
if (ret < 0) {
BACK_LOGW("Failed to read IP %d", ret);
break;
}
unw_word_t sp;
ret = unw_get_reg(&cursor, UNW_REG_SP, &sp);
if (ret < 0) {
BACK_LOGW("Failed to read SP %d", ret);
break;
}
if (num_ignore_frames == 0) {
frames_.resize(num_frames+1);
backtrace_frame_data_t* frame = &frames_.at(num_frames);
frame->num = num_frames;
frame->pc = static_cast<uintptr_t>(pc);
frame->sp = static_cast<uintptr_t>(sp);
frame->stack_size = 0;
if (num_frames > 0) {
backtrace_frame_data_t* prev = &frames_.at(num_frames-1);
prev->stack_size = frame->sp - prev->sp;
}
FillInMap(frame->pc, &frame->map);
if (BacktraceMap::IsValid(frame->map)) {
frame->rel_pc = frame->pc - frame->map.start + frame->map.load_bias;
} else {
frame->rel_pc = frame->pc;
}
frame->func_name = GetFunctionName(frame->pc, &frame->func_offset, &frame->map);
num_frames++;
// If the pc is in a device map, then don't try to step.
if (frame->map.flags & PROT_DEVICE_MAP) {
break;
}
} else {
// If the pc is in a device map, then don't try to step.
backtrace_map_t map;
FillInMap(pc, &map);
if (map.flags & PROT_DEVICE_MAP) {
break;
}
num_ignore_frames--;
}
// Verify the sp is not in a device map.
backtrace_map_t map;
FillInMap(sp, &map);
if (map.flags & PROT_DEVICE_MAP) {
break;
}
ret = unw_step (&cursor);
} while (ret > 0 && num_frames < MAX_BACKTRACE_FRAMES);
return true;
}
开发者ID:BenzoRoms,项目名称:system_core,代码行数:89,代码来源:UnwindPtrace.cpp
示例13: GetMap
bool Transport::TeleportTransport(uint32 newMapid, float x, float y, float z, float o)
{
Map const* oldMap = GetMap();
if (oldMap->GetId() != newMapid)
{
Map* newMap = sMapMgr->CreateBaseMap(newMapid);
UnloadStaticPassengers();
GetMap()->RemoveFromMap<Transport>(this, false);
SetMap(newMap);
for (std::set<WorldObject*>::iterator itr = _passengers.begin(); itr != _passengers.end();)
{
WorldObject* obj = (*itr++);
float destX, destY, destZ, destO;
obj->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO);
TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o);
switch (obj->GetTypeId())
{
case TYPEID_UNIT:
if (!IS_PLAYER_GUID(obj->ToUnit()->GetOwnerGUID())) // pets should be teleported with player
obj->ToCreature()->FarTeleportTo(newMap, destX, destY, destZ, destO);
break;
case TYPEID_GAMEOBJECT:
{
GameObject* go = obj->ToGameObject();
go->GetMap()->RemoveFromMap(go, false);
go->Relocate(destX, destY, destZ, destO);
go->SetMap(newMap);
newMap->AddToMap(go);
break;
}
case TYPEID_PLAYER:
if (!obj->ToPlayer()->TeleportTo(newMapid, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT))
_passengers.erase(obj);
break;
case TYPEID_DYNAMICOBJECT:
obj->AddObjectToRemoveList();
break;
default:
break;
}
}
Relocate(x, y, z, o);
UpdateModelPosition();
GetMap()->AddToMap<Transport>(this);
return true;
}
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)
{
float destX, destY, destZ, destO;
(*itr)->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO);
TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o);
(*itr)->ToUnit()->NearTeleportTo(destX, destY, destZ, destO);
}
}
UpdatePosition(x, y, z, o);
return false;
}
}
开发者ID:BravadoToDeath,项目名称:ArkCORE-NG,代码行数:70,代码来源:Transport.cpp
示例14: AI
void Transport::Update(uint32 diff)
{
uint32 const positionUpdateDelay = 200;
if (AI())
AI()->UpdateAI(diff);
else if (!AIM_Initialize())
TC_LOG_ERROR("entities.transport", "Could not initialize GameObjectAI for Transport");
if (GetKeyFrames().size() <= 1)
return;
if (IsMoving() || !_pendingStop)
m_goValue.Transport.PathProgress += diff;
uint32 timer = m_goValue.Transport.PathProgress % GetPeriod();
// Set current waypoint
// Desired outcome: _currentFrame->DepartureTime < timer < _nextFrame->ArriveTime
// ... arrive | ... delay ... | departure
// event / event /
for (;;)
{
if (timer >= _currentFrame->ArriveTime)
{
if (!_triggeredArrivalEvent)
{
DoEventIfAny(*_currentFrame, false);
_triggeredArrivalEvent = true;
}
if (timer < _currentFrame->DepartureTime)
{
SetMoving(false);
if (_pendingStop && GetGoState() != GO_STATE_READY)
{
SetGoState(GO_STATE_READY);
m_goValue.Transport.PathProgress = (m_goValue.Transport.PathProgress / GetPeriod());
m_goValue.Transport.PathProgress *= GetPeriod();
m_goValue.Transport.PathProgress += _currentFrame->ArriveTime;
}
break; // its a stop frame and we are waiting
}
}
if (timer >= _currentFrame->DepartureTime && !_triggeredDepartureEvent)
{
DoEventIfAny(*_currentFrame, true); // departure event
_triggeredDepartureEvent = true;
}
// not waiting anymore
SetMoving(true);
// Enable movement
if (GetGOInfo()->moTransport.canBeStopped)
SetGoState(GO_STATE_ACTIVE);
if (timer >= _currentFrame->DepartureTime && timer < _currentFrame->NextArriveTime)
break; // found current waypoint
MoveToNextWaypoint();
sScriptMgr->OnRelocate(this, _currentFrame->Node->index, _currentFrame->Node->mapid, _currentFrame->Node->x, _currentFrame->Node->y, _currentFrame->Node->z);
TC_LOG_DEBUG("entities.transport", "Transport %u (%s) moved to node %u %u %f %f %f", GetEntry(), GetName().c_str(), _currentFrame->Node->index, _currentFrame->Node->mapid, _currentFrame->Node->x, _currentFrame->Node->y, _currentFrame->Node->z);
// Departure event
if (_currentFrame->IsTeleportFrame())
if (TeleportTransport(_nextFrame->Node->mapid, _nextFrame->Node->x, _nextFrame->Node->y, _nextFrame->Node->z, _nextFrame->InitialOrientation))
return; // Update more in new map thread
}
// Set position
_positionChangeTimer.Update(diff);
if (_positionChangeTimer.Passed())
{
_positionChangeTimer.Reset(positionUpdateDelay);
if (IsMoving())
{
float t = CalculateSegmentPos(float(timer) * 0.001f);
G3D::Vector3 pos, dir;
_currentFrame->Spline->evaluate_percent(_currentFrame->Index, t, pos);
_currentFrame->Spline->evaluate_derivative(_currentFrame->Index, t, dir);
UpdatePosition(pos.x, pos.y, pos.z, atan2(dir.y, dir.x) + M_PI);
}
else
{
/* There are four possible scenarios that trigger loading/unloading passengers:
1. transport moves from inactive to active grid
2. the grid that transport is currently in becomes active
3. transport moves from active to inactive grid
4. the grid that transport is currently in unloads
*/
if (_staticPassengers.empty() && GetMap()->IsGridLoaded(GetPositionX(), GetPositionY())) // 2.
LoadStaticPassengers();
}
}
sScriptMgr->OnTransportUpdate(this, diff);
//.........这里部分代码省略.........
开发者ID:BravadoToDeath,项目名称:ArkCORE-NG,代码行数:101,代码来源:Transport.cpp
示例15: PathBuild
int PathBuild(void* data)
{
auto enemy = static_cast<Enemy*>(data);
std::vector<Vector2D> result;
auto m_searchPath = enemy->GetSearhPath();
if(m_searchPath.size() > 0)
{
std::vector<std::pair<Vector2D, Vector2D>> path;
Vector2D prev = m_searchPath[0];
for(int i=1; i<m_searchPath.size(); i++)
{
auto first = prev;
auto second = m_searchPath[i];
prev = second;
std::pair<Vector2D, Vector2D> pair(first, second);
path.push_back(pair);
}
for(auto v : path)
{
auto first = v.first;
first.x *= enemy->GetMap()->GetTileWidth();
first.y *= enemy->GetMap()->GetTileHeight();
first.x += ENEMY_SPRITE_SIZE/2;
first.y += ENEMY_SPRITE_SIZE/2;
auto last = v.second;
last.x *= enemy->GetMap()->GetTileWidth();
last.y *= enemy->GetMap()->GetTileHeight();
last.x += ENEMY_SPRITE_SIZE/2;
last.y += ENEMY_SPRITE_SIZE/2;
auto slope = 1;
if(last.x-first.x != 0)
{
slope = (last.y-first.y)/(last.x-first.x);
}
bool normalX = (first.x <= last.x) ? true : false;
bool normalY = (first.y <= last.y) ? true : false;
if(normalX)
{
for(int x=first.x; x<last.x; x++)
{
auto y=slope*(x-first.x)+first.y;
result.push_back(Vector2D(x, y));
}
}
else
{
for(int x=first.x; x>last.x; x--)
{
auto y=slope*(x-first.x)+first.y;
result.push_back(Vector2D(x, y));
}
}
if(slope==1)
{
if(normalY)
{
for(int y=first.y; y<last.y; y++)
{
result.push_back(Vector2D(first.x, y));
}
}
else
{
for(int y=first.y; y>last.y; y--)
{
result.push_back(Vector2D(first.x, y));
}
}
}
}
}
enemy->SetPathBuildResult(result);
return 1;
}
开发者ID:zulis,项目名称:Platformer,代码行数:87,代码来源:PathBuild.cpp
示例16: ASSERT
void CUser::Regene(uint8 regene_type, uint32 magicid /*= 0*/)
{
ASSERT(GetMap() != nullptr);
_OBJECT_EVENT* pEvent = nullptr;
_HOME_INFO* pHomeInfo = nullptr;
float x = 0.0f, z = 0.0f;
if (!isDead())
return;
if (regene_type != 1 && regene_type != 2)
regene_type = 1;
if (regene_type == 2)
{
magicid = 490041; // The Stone of Ressurection magic ID
// Is our level high enough to be able to resurrect using this skill?
if (GetLevel() <= 5
// Do we have enough resurrection stones?
|| !RobItem(379006000, 3 * GetLevel()))
return;
}
// If we're in a home zone, we'll want the coordinates from there. Otherwise, assume our own home zone.
pHomeInfo = g_pMain->m_HomeArray.GetData(GetZoneID() <= ZONE_ELMORAD ? GetZoneID() : GetNation());
if (pHomeInfo == nullptr)
return;
UserInOut(INOUT_OUT);
pEvent = GetMap()->GetObjectEvent(m_sBind);
// If we're not using a spell to resurrect.
if (magicid == 0)
{
// Resurrect at a bind/respawn point
if (pEvent != nullptr && pEvent->byLife == 1)
{
SetPosition(pEvent->fPosX + x, 0.0f, pEvent->fPosZ + z);
}
// Are we trying to respawn in a home zone?
else if (GetZoneID() <= ZONE_ELMORAD)
{
// Use the proper respawn area for our nation, as the opposite nation can
// enter this zone at a war's invasion stage.
if (GetNation() == KARUS)
{
x = (float)(pHomeInfo->KarusZoneX + myrand(0, pHomeInfo->KarusZoneLX));
z = (float)(pHomeInfo->KarusZoneZ + myrand(0, pHomeInfo->KarusZoneLZ));
}
else
{
x = (float)(pHomeInfo->ElmoZoneX + myrand(0, pHomeInfo->ElmoZoneLX));
z = (float)(pHomeInfo->ElmoZoneZ + myrand(0, pHomeInfo->ElmoZoneLZ));
}
}
else
{
// If we're in a war zone (aside from snow wars, which apparently use different coords), use BattleZone coordinates.
if (GetZoneID() != ZONE_SNOW_BATTLE
&& GetZoneID() == (ZONE_BATTLE_BASE + g_pMain->m_byBattleZone))
{
x = (float)(pHomeInfo->BattleZoneX + myrand(0, pHomeInfo->BattleZoneLX));
z = (float)(pHomeInfo->BattleZoneZ + myrand(0, pHomeInfo->BattleZoneLZ));
}
// If we died in the Moradon arena, we need to spawn near the Arena.
else if (GetZoneID() == ZONE_MORADON && isInArena())
{
x = (float)(MINI_ARENA_RESPAWN_X + myrand(-MINI_ARENA_RESPAWN_RADIUS, MINI_ARENA_RESPAWN_RADIUS));
z = (float)(MINI_ARENA_RESPAWN_Z + myrand(-MINI_ARENA_RESPAWN_RADIUS, MINI_ARENA_RESPAWN_RADIUS));
}
// For all else, just grab the start position (/town coordinates) from the START_POSITION table.
else
{
short sx, sz;
GetStartPosition(sx, sz);
x = sx;
z = sz;
}
}
SetPosition(x, 0.0f, z);
m_bResHpType = USER_STANDING;
m_bRegeneType = REGENE_NORMAL;
}
else // we're respawning using a resurrect skill.
{
_MAGIC_TYPE5 * pType = g_pMain->m_Magictype5Array.GetData(magicid);
if (pType == nullptr)
return;
MSpChange(-m_iMaxMp); // reset us to 0 MP.
if (m_sWhoKilledMe == -1)
ExpChange((m_iLostExp * pType->bExpRecover) / 100); // Restore
//.........
|
请发表评论