void Transporter::UpdatePosition() { if (m_WayPoints.size() <= 1) return; m_timer = (getMSTime() + m_period) % m_pathTime; while (((m_timer - mCurrentWaypoint->first) % m_pathTime) >= ((mNextWaypoint->first - mCurrentWaypoint->first) % m_pathTime)) { /*printf("%s from %u %f %f %f to %u %f %f %f\n", this->GetInfo()->Name, mCurrentWaypoint->second.mapid, mCurrentWaypoint->second.x,mCurrentWaypoint->second.y,mCurrentWaypoint->second.z, mNextWaypoint->second.mapid, mNextWaypoint->second.x,mNextWaypoint->second.y,mNextWaypoint->second.z);*/ mCurrentWaypoint = mNextWaypoint; mNextWaypoint = GetNextWaypoint(); if (mNextWaypoint->second.mapid != GetMapId()) { mCurrentWaypoint = mNextWaypoint; mNextWaypoint = GetNextWaypoint(); TransportPassengers(mNextWaypoint->second.mapid, GetMapId(), mNextWaypoint->second.x, mNextWaypoint->second.y, mNextWaypoint->second.z); break; } else { SetPosition(mNextWaypoint->second.x, mNextWaypoint->second.y, mNextWaypoint->second.z, m_position.o, false); } if(mCurrentWaypoint->second.delayed) { PlaySoundToSet(5495); // BoatDockedWarning.wav } } }
void Transporter::UpdatePosition() { if (m_WayPoints.size() <= 1) return; m_timer = getMSTime() % m_period; while (((m_timer - mCurrentWaypoint->first) % m_pathTime) >= ((mNextWaypoint->first - mCurrentWaypoint->first) % m_pathTime)) { mCurrentWaypoint = mNextWaypoint; mNextWaypoint = GetNextWaypoint(); if (mNextWaypoint->second.mapid != GetMapId() || mCurrentWaypoint->second.teleport) { TransportPassengers(mNextWaypoint->second.mapid, GetMapId(), mNextWaypoint->second.x, mNextWaypoint->second.y, mNextWaypoint->second.z); break; } else { SetPosition(mNextWaypoint->second.x, mNextWaypoint->second.y, mNextWaypoint->second.z, m_position.o, false); } if(mCurrentWaypoint->second.delayed) PlaySoundToSet(5495); // BoatDockedWarning.wav } }
void AProtherer::MoveOrc() { this->sayDialog(&((new FString("Responding to transportation type: "))->Append(*(TransportUsed.Last(0))))); this->CurrentLocation = GetNextWaypoint(); UNavigationSystem::SimpleMoveToLocation(GetController(), this->CurrentLocation->GetActorLocation()); this->IsMoving = true; }
void Transporter::Update() { if (m_WayPoints.size() <= 1) return; m_timer = Util::getMSTime() % m_period; while (((m_timer - mCurrentWaypoint->first) % m_pathTime) > ((mNextWaypoint->first - mCurrentWaypoint->first) % m_pathTime)) { GetNextWaypoint(); // first check help in case client-server transport coordinates de-synchronization if (mCurrentWaypoint->second.mapid != GetMapId() || mCurrentWaypoint->second.teleport) { TeleportTransport(mCurrentWaypoint->second.mapid, GetMapId(), mCurrentWaypoint->second.x, mCurrentWaypoint->second.y, mCurrentWaypoint->second.z); break; } else { SetPosition(mCurrentWaypoint->second.x, mCurrentWaypoint->second.y, mCurrentWaypoint->second.z, std::atan2(mNextWaypoint->second.x, mNextWaypoint->second.y) + float(M_PI), false); UpdatePlayerPositions(mCurrentWaypoint->second.x, mCurrentWaypoint->second.y, mCurrentWaypoint->second.z, std::atan2(mNextWaypoint->second.x, mNextWaypoint->second.y) + float(M_PI)); // After a few tests (Durotar<->Northrend we need this, otherwise npc disappear on entering new map/zone/area DankoDJ // Update Creature Position with Movement Info from Gameobject too prevent coord changes from Transporter Waypoint and Gameobject Position Aaron02 #if VERSION_STRING != Cata UpdateNPCPositions(obj_movement_info.transport_data.relativePosition.x, obj_movement_info.transport_data.relativePosition.y, obj_movement_info.transport_data.relativePosition.z, std::atan2(obj_movement_info.transport_data.relativePosition.x, obj_movement_info.transport_data.relativePosition.y) + float(M_PI)); #else UpdateNPCPositions(obj_movement_info.getTransportPosition()->x, obj_movement_info.getTransportPosition()->y, obj_movement_info.getTransportPosition()->z, std::atan2(obj_movement_info.getTransportPosition()->x, obj_movement_info.getTransportPosition()->y) + float(M_PI)); #endif } if (mCurrentWaypoint->second.delayed) { switch (GetGameObjectProperties()->display_id) { case 3015: case 7087: { PlaySoundToSet(5154); // ShipDocked LightHouseFogHorn.wav } break; case 3031: { PlaySoundToSet(11804); // ZeppelinDocked ZeppelinHorn.wav } break; default: { PlaySoundToSet(5495); // BoatDockingWarning BoatDockedWarning.wav } break; } TransportGossip(GetGameObjectProperties()->display_id); } } }
void Transporter::UpdatePosition() { if (m_WayPoints.size() <= 1) return; m_timer = getMSTime() % m_period; while (((m_timer - mCurrentWaypoint->first) % m_pathTime) >= ((mNextWaypoint->first - mCurrentWaypoint->first) % m_pathTime)) { /*printf("%s from %u %f %f %f to %u %f %f %f\n", this->GetInfo()->Name, mCurrentWaypoint->second.mapid, mCurrentWaypoint->second.x,mCurrentWaypoint->second.y,mCurrentWaypoint->second.z, mNextWaypoint->second.mapid, mNextWaypoint->second.x,mNextWaypoint->second.y,mNextWaypoint->second.z);*/ mCurrentWaypoint = mNextWaypoint; mNextWaypoint = GetNextWaypoint(); if (mCurrentWaypoint->second.mapid != GetMapId() || mCurrentWaypoint->second.teleport) { passengers.clear(); TransportPassengers(mCurrentWaypoint->second.mapid, GetMapId(), mCurrentWaypoint->second.x, mCurrentWaypoint->second.y, mCurrentWaypoint->second.z); break; } else{ SetPosition(mCurrentWaypoint->second.x, mCurrentWaypoint->second.y, mCurrentWaypoint->second.z, m_position.o, false); MovePassengers(mCurrentWaypoint->second.x, mCurrentWaypoint->second.y, mCurrentWaypoint->second.z, m_position.o); } if (mCurrentWaypoint->second.delayed) { //Transprter Script = sScriptMgr.CreateAIScriptClassForGameObject(GetEntry(), this); switch (GetInfo()->DisplayID) { case 3015: case 7087: { PlaySoundToSet(5154); // ShipDocked LightHouseFogHorn.wav } break; case 3031: { PlaySoundToSet(11804); // ZeppelinDocked ZeppelinHorn.wav } break; default: { PlaySoundToSet(5495); // BoatDockingWarning BoatDockedWarning.wav } break; } TransportGossip(GetInfo()->DisplayID); } } }
void Transporter::EventClusterMapChange( uint32 mapid, LocationVector l ) { m_WayPoints.clear(); if (!GenerateWaypoints()) return; SetPosition(l.x, l.y, l.z, 0); //hmmm, ok for (WaypointMap::iterator itr=m_WayPoints.begin(); itr!=m_WayPoints.end(); ++itr) { if (itr->second.x == l.x && itr->second.y == l.y && itr->second.z == l.z) { mCurrentWaypoint = itr; break; } } mNextWaypoint = GetNextWaypoint(); //m_canMove = true; }
bool Transporter::GenerateWaypoints() { TransportPath path; FillPathVector(GetInfo()->MoTransport.TaxiPathId, path); if(path.Size() == 0) return false; vector<keyFrame> keyFrames; int mapChange = 0; for (int i = 1; i < (int)path.Size() - 1; i++) { if (mapChange == 0) { if ((path[i].mapid == path[i+1].mapid)) { keyFrame k(path[i].x, path[i].y, path[i].z, path[i].mapid, path[i].actionFlag, path[i].delay); keyFrames.push_back(k); } else { mapChange = 1; } } else { mapChange--; } } int lastStop = -1; int firstStop = -1; // first cell is arrived at by teleportation :S keyFrames[0].distFromPrev = 0; if (keyFrames[0].actionflag == 2) { lastStop = 0; } // find the rest of the distances between key points for (size_t i = 1; i < keyFrames.size(); i++) { if ((keyFrames[i-1].actionflag == 1) || (keyFrames[i].mapid != keyFrames[i-1].mapid)) { keyFrames[i].distFromPrev = 0; } else { keyFrames[i].distFromPrev = sqrt(pow(keyFrames[i].x - keyFrames[i - 1].x, 2) + pow(keyFrames[i].y - keyFrames[i - 1].y, 2) + pow(keyFrames[i].z - keyFrames[i - 1].z, 2)); } if (keyFrames[i].actionflag == 2) { if(firstStop<0) firstStop=(int)i; lastStop = (int)i; } } float tmpDist = 0; for (int i = 0; i < (int)keyFrames.size(); i++) { if( lastStop < 0 || firstStop < 0 ) // IT NEVER STOPS :O continue; int j = (i + lastStop) % (int)keyFrames.size(); if (keyFrames[j].actionflag == 2) tmpDist = 0; else tmpDist += keyFrames[j].distFromPrev; keyFrames[j].distSinceStop = tmpDist; } for (int i = int(keyFrames.size()) - 1; i >= 0; i--) { int j = (i + (firstStop+1)) % (int)keyFrames.size(); tmpDist += keyFrames[(j + 1) % keyFrames.size()].distFromPrev; keyFrames[j].distUntilStop = tmpDist; if (keyFrames[j].actionflag == 2) tmpDist = 0; } for (size_t i = 0; i < keyFrames.size(); i++) { if (keyFrames[i].distSinceStop < (30 * 30 * 0.5)) keyFrames[i].tFrom = sqrt(2 * keyFrames[i].distSinceStop); else keyFrames[i].tFrom = ((keyFrames[i].distSinceStop - (30 * 30 * 0.5f)) / 30) + 30; if (keyFrames[i].distUntilStop < (30 * 30 * 0.5)) keyFrames[i].tTo = sqrt(2 * keyFrames[i].distUntilStop); else keyFrames[i].tTo = ((keyFrames[i].distUntilStop - (30 * 30 * 0.5f)) / 30) + 30; keyFrames[i].tFrom *= 1000; keyFrames[i].tTo *= 1000; } // for (int i = 0; i < keyFrames.size(); i++) { // sLog.outString("%f, %f, %f, %f, %f, %f, %f", keyFrames[i].x, keyFrames[i].y, keyFrames[i].distUntilStop, keyFrames[i].distSinceStop, keyFrames[i].distFromPrev, keyFrames[i].tFrom, keyFrames[i].tTo); // } // Now we're completely set up; we can move along the length of each waypoint at 100 ms intervals // speed = max(30, t) (remember x = 0.5s^2, and when accelerating, a = 1 unit/s^2 int t = 0; bool teleport = false; if (keyFrames[keyFrames.size() - 1].mapid != keyFrames[0].mapid) teleport = true; TWayPoint pos(keyFrames[0].mapid, keyFrames[0].x, keyFrames[0].y, keyFrames[0].z, teleport); uint32 last_t = 0; m_WayPoints[0] = pos; t += keyFrames[0].delay * 1000; int cM = keyFrames[0].mapid; for (size_t i = 0; i < keyFrames.size() - 1; i++) // { float d = 0; float tFrom = keyFrames[i].tFrom; float tTo = keyFrames[i].tTo; // keep the generation of all these points; we use only a few now, but may need the others later if (((d < keyFrames[i + 1].distFromPrev) && (tTo > 0))) { while ((d < keyFrames[i + 1].distFromPrev) && (tTo > 0)) { tFrom += 100; tTo -= 100; if (d > 0) { float newX, newY, newZ; newX = keyFrames[i].x + (keyFrames[i + 1].x - keyFrames[i].x) * d / keyFrames[i + 1].distFromPrev; newY = keyFrames[i].y + (keyFrames[i + 1].y - keyFrames[i].y) * d / keyFrames[i + 1].distFromPrev; newZ = keyFrames[i].z + (keyFrames[i + 1].z - keyFrames[i].z) * d / keyFrames[i + 1].distFromPrev; bool teleport = false; if ((int)keyFrames[i].mapid != cM) { teleport = true; cM = keyFrames[i].mapid; } // sLog.outString("T: %d, D: %f, x: %f, y: %f, z: %f", t, d, newX, newY, newZ); TWayPoint pos(keyFrames[i].mapid, newX, newY, newZ, teleport); if (teleport || ((t - last_t) >= 1000)) { m_WayPoints[t] = pos; last_t = t; } } if (tFrom < tTo) // caught in tFrom dock's "gravitational pull" { if (tFrom <= 30000) { d = 0.5f * (tFrom / 1000) * (tFrom / 1000); } else { d = 0.5f * 30 * 30 + 30 * ((tFrom - 30000) / 1000); } d = d - keyFrames[i].distSinceStop; } else { if (tTo <= 30000) { d = 0.5f * (tTo / 1000) * (tTo / 1000); } else { d = 0.5f * 30 * 30 + 30 * ((tTo - 30000) / 1000); } d = keyFrames[i].distUntilStop - d; } t += 100; } t -= 100; } if (keyFrames[i + 1].tFrom > keyFrames[i + 1].tTo) t += 100 - ((long)keyFrames[i + 1].tTo % 100); else t += (long)keyFrames[i + 1].tTo % 100; bool teleport = false; if ((keyFrames[i + 1].actionflag == 1) || (keyFrames[i + 1].mapid != keyFrames[i].mapid)) { teleport = true; cM = keyFrames[i + 1].mapid; } TWayPoint pos(keyFrames[i + 1].mapid, keyFrames[i + 1].x, keyFrames[i + 1].y, keyFrames[i + 1].z, teleport); // sLog.outString("T: %d, x: %f, y: %f, z: %f, t:%d", t, pos.x, pos.y, pos.z, teleport); //if (teleport) //m_WayPoints[t] = pos; if(keyFrames[i+1].delay > 5) pos.delayed = true; m_WayPoints.insert(WaypointMap::value_type(t, pos)); last_t = t; t += keyFrames[i + 1].delay * 1000; // sLog.outString("------"); } uint32 timer = t; mCurrentWaypoint = m_WayPoints.begin(); //mCurrentWaypoint = GetNextWaypoint(); mNextWaypoint = GetNextWaypoint(); m_pathTime = timer; m_timer = 0; m_period = t; return true; }