void CTransportHandler::TransportTimer() { uint32 VanaTime = CVanaTime::getInstance()->getDate(); // в портовых зонах необходимо написать макросы на случай, если персонаж вышел из игры в корабле. // при входе в игру он должен оказаться на пристани for(uint32 i = 0; i < TransportList.size(); ++i) { Transport_t* PTransport = TransportList.at(i); uint16 ShipTimerOffset = ((VanaTime - PTransport->TimeOffset) % PTransport->TimeInterval); // корабль появляется на горизонте if (ShipTimerOffset == 0) { PTransport->PTransportNPC->status = STATUS_NORMAL; PTransport->PTransportNPC->animation = PTransport->AnimationArrive; PTransport->PTransportNPC->loc = PTransport->Dock; WBUFL(&PTransport->PTransportNPC->name[0],4) = CVanaTime::getInstance()->getVanaTime(); PTransport->Dock.zone->PushPacket(NULL, CHAR_INZONE, new CEntityUpdatePacket(PTransport->PTransportNPC, ENTITY_SPAWN, UPDATE_ALL)); } // персонажи видят корабль, иначе ждем следующего прибытия else if (PTransport->PTransportNPC->status == STATUS_NORMAL) { // пора подтягивать пассажиров к выходу if (ShipTimerOffset == PTransport->TimeAnimationArrive - 10) { PTransport->PTransportNPC->loc.boundary = 0; zoneutils::GetZone(PTransport->Dock.prevzone)->TransportDepart(PTransport->PTransportNPC); } // корабль причалил, открываем двери пассажирам else if (ShipTimerOffset == PTransport->TimeAnimationArrive) { PTransport->PDoorNPC->animation = ANIMATION_OPEN_DOOR; PTransport->Dock.zone->PushPacket(PTransport->PDoorNPC, CHAR_INRANGE, new CEntityUpdatePacket(PTransport->PDoorNPC, ENTITY_UPDATE, UPDATE_COMBAT)); } //корабль отчаливает else if (ShipTimerOffset == PTransport->TimeAnimationArrive + PTransport->TimeWaiting) { PTransport->PDoorNPC->animation = ANIMATION_CLOSE_DOOR; PTransport->PTransportNPC->animation = PTransport->AnimationDepart; PTransport->PTransportNPC->loc.boundary = PTransport->Dock.boundary; WBUFL(&PTransport->PTransportNPC->name[0],4) = CVanaTime::getInstance()->getVanaTime(); PTransport->Dock.zone->TransportDepart(PTransport->PTransportNPC); PTransport->Dock.zone->PushPacket(PTransport->PDoorNPC, CHAR_INRANGE, new CEntityUpdatePacket(PTransport->PDoorNPC, ENTITY_UPDATE, UPDATE_COMBAT)); PTransport->Dock.zone->PushPacket(NULL, CHAR_INZONE, new CEntityUpdatePacket(PTransport->PTransportNPC, ENTITY_UPDATE, UPDATE_COMBAT)); } //корабль исчезает else if (ShipTimerOffset == PTransport->TimeAnimationArrive + PTransport->TimeWaiting + PTransport->TimeAnimationDepart) { PTransport->PTransportNPC->status = STATUS_DISAPPEAR; PTransport->Dock.zone->PushPacket(NULL, CHAR_INZONE, new CEntityUpdatePacket(PTransport->PTransportNPC, ENTITY_DESPAWN,UPDATE_NONE)); } } } for(uint32 i = 0; i < ElevatorList.size(); ++i) { Elevator_t * elevator = &ElevatorList.at(i); if (elevator->isStarted) { uint16 TimerOffset = (VanaTime % elevator->interval); if (elevator->id == ELEVATOR_PORT_BASTOK_DRWBRDG) { TimerOffset = (VanaTime % INTERVAL_PORT_BASTOK_DRWBRDG); if (TimerOffset == 0 || TimerOffset == 76) { CZone* PZone = zoneutils::GetZone(elevator->zone); EntityList_t charList = PZone->GetCharList(); if (!charList.empty()) { for (EntityList_t::const_iterator it = charList.begin() ; it != charList.end() ; ++it) { CCharEntity* PChar = (CCharEntity*)it->second; if ((PChar->GetXPos() > 54 && PChar->GetXPos() < 66) && (PChar->GetZPos() > -160 && PChar->GetZPos() < -80)) { PChar->pushPacket(new CEventPacket(PChar, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1)); } } } } else if (TimerOffset == 4 || TimerOffset == 80) { elevator->isMoving = true; startElevator(elevator); } else if (TimerOffset == 8 || TimerOffset == 84) { elevator->isMoving = true; startElevator(elevator); } else if (TimerOffset == 12 || TimerOffset == 88) { elevator->isMoving = false; arriveElevator(elevator); } } else if (elevator->id == ELEVATOR_KUFTAL_TUNNEL_DSPPRNG_RCK) { TimerOffset = (VanaTime % INTERVAL_KUFTAL_TUNNEL_DSPPRNG_RCK); if (TimerOffset == 60) { elevator->isMoving = true; startElevator(elevator); } } else { if (TimerOffset == 0) { elevator->isMoving = true; startElevator(elevator); } else if (TimerOffset == elevator->movetime) { if (elevator->isMoving) { if (!elevator->isPermanent) { elevator->isStarted = false; } elevator->isMoving = false; arriveElevator(elevator); } } } } } }