Пример #1
0
// Spawns a player at a particular spawn point
void _Server::SpawnPlayer(_Object *Player, NetworkIDType MapID, uint32_t EventType) {
	if(!ValidatePeer(Player->Peer) || !Player->Peer->CharacterID || !MapID)
	   return;

	// Get map
	_Map *Map = MapManager->GetObject(MapID);

	// Load map
	if(!Map) {
		Map = MapManager->CreateWithID(MapID);
		Map->Clock = Clock;
		Map->Server = this;
		Map->Load(Stats->GetMap(MapID)->File);
	}

	// Get old map
	_Map *OldMap = Player->Map;

	// Place player in new map
	if(Map != OldMap) {
		if(OldMap) {
			OldMap->RemoveObject(Player);
		}

		Player->Map = Map;

		// Find spawn point in map
		uint32_t SpawnPoint = Player->SpawnPoint;
		if(EventType == _Map::EVENT_MAPENTRANCE)
			SpawnPoint = OldMap->NetworkID;

		// Default to mapchange event if entrance not found
		if(!Map->FindEvent(_Event(EventType, SpawnPoint), Player->Position))
			Map->FindEvent(_Event(_Map::EVENT_MAPCHANGE, SpawnPoint), Player->Position);

		// Add player to map
		Map->AddObject(Player);

		// Send new map id
		_Buffer Packet;
		Packet.Write<PacketType>(PacketType::WORLD_CHANGEMAPS);
		Packet.Write<uint32_t>(MapID);
		Packet.Write<double>(Clock);
		Network->SendPacket(Packet, Player->Peer);

		// Set player object list
		Map->SendObjectList(Player->Peer);

		// Set full player data to peer
		SendPlayerInfo(Player->Peer);
	}
	else {
		Map->FindEvent(_Event(EventType, Player->SpawnPoint), Player->Position);
		SendPlayerPosition(Player->Peer);
		SendHUD(Player->Peer);
	}
}
Пример #2
0
void CGame::Event (int ID, int iTyp, CPlayer * pPlayer)
{

	if (pPlayer == NULL)
		{
		TRAP ();
		return;
		}

	if ( ! pPlayer->IsMe () )
		return;

	_Event ( ID, iTyp, pPlayer->GetName (), 0 );
}
Пример #3
0
int kernel(void)
{
  /* Vacuous terminate */;
  if (_state_1) {
    _s.fun = 0, strcpy(fun_v, "None");;;
    _state_1 = 0;
  } else {
    _state_1 = 0;
    if (_s.ev) {
      _Event(&X, ev_v);
      strcpy(f, do_lookup(X));
      (strcpy(fun_v, f)), (_s.fun = 1);
    }
  }
  if (_s.fun) { kernel_O_fun(fun_v); _s.fun = 0; }
  _s.ev = 0;
  return 1;
}
Пример #4
0
void CGame::Event (int ID, int iTyp, int iVal)
{

	char const * psText;
	switch (ID)
	  {
		case EVENT_HPR_NOACCESS :
		case EVENT_HPR_NOPICKUP : {
			int iTyp = __minmax ( 0, CMaterialTypes::GetNumTypes (), iVal );
			psText = CMaterialTypes::GetDesc ( iTyp );
			break; }
		case EVENT_CONST_CANT :
			psText = theStructures.GetData (iVal)->GetDesc ();
			break;
		default:
			psText = NULL;
			break;
		}

	_Event ( ID, iTyp, psText, 0 );
}
Пример #5
0
void CGame::Event (int ID, int iTyp, CUnit *pUnit)
{

	if (pUnit == NULL)
		{
		TRAP ();
		return;
		}

	if ( ! pUnit->GetOwner()->IsMe () )
		return;

	char const * psText;
	switch (ID)
	  {
		case EVENT_CONST_CANT :
			psText = theStructures.GetData (((CVehicle *)pUnit)->GetBldgType ())->GetDesc ();
			break;

		case EVENT_BUILD_HALTED :
		case EVENT_BUILD_DONE :
			psText = theTransports.GetData (((CVehicleBuilding*)pUnit)->GetBldUnt()->GetVehType ())->GetDesc ();
			break;

		case EVENT_ATK_TARGET :
		case EVENT_ATK_DESTROYED : {
			CUnit * pTarget = pUnit->GetTarget ();
			if ((pTarget != NULL) && (pTarget->GetUnitType () == CUnit::building))
				psText = theStructures.GetData (((CBuilding *)pTarget)->GetData()->GetType ())->GetDesc ();
			else
				psText = NULL;
			break; }
	
		default:
			psText = pUnit->GetData()->GetDesc ();
			break;
	  }

	_Event ( ID, iTyp, psText, pUnit->GetVoice () );
}
Пример #6
0
// Update bot based on goals
void _Bot::EvaluateGoal() {

	// Respawn
	if(!Player->WaitForServer && !Player->IsAlive()) {
		_Buffer Packet;
		Packet.Write<PacketType>(PacketType::WORLD_RESPAWN);
		Network->SendPacket(Packet);

		Player->WaitForServer = true;
		return;
	}

	// Evaluate goal
	switch(GoalState) {
		case GoalStateType::NONE:
			DetermineNextGoal();
		break;
		case GoalStateType::FARMING:
			if(Map->NetworkID != 11) {
				if(Map->NetworkID != 10) {
					glm::ivec2 Position;
					if(FindEvent(_Event(_Map::EVENT_MAPCHANGE, 10), Position))
						MoveTo(Player->Position, Position);
				}
				else if(Map->NetworkID == 10) {
					glm::ivec2 Position;
					if(FindEvent(_Event(_Map::EVENT_MAPCHANGE, 11), Position))
						MoveTo(Player->Position, Position);
				}
			}
			else if(Map->NetworkID == 11) {
				glm::ivec2 Position;
				if(FindEvent(_Event(_Map::EVENT_SCRIPT, 3), Position))
					MoveTo(Player->Position, Position);
			}
			else {
				BotState = BotStateType::MOVE_RANDOM;
			}
		break;
		case GoalStateType::HEALING:
			if(Map->NetworkID != 1) {
				if(!Player->WaitForServer && Player->CanTeleport()) {
				   _Buffer Packet;
				   Packet.Write<PacketType>(PacketType::PLAYER_STATUS);
				   Packet.Write<uint8_t>(_Object::STATUS_TELEPORT);
				   Network->SendPacket(Packet);

				   Player->WaitForServer = true;
				}
			}
			else {
				if(Player->GetHealthPercent() < 1.0f) {
					glm::ivec2 Position;
					if(FindEvent(_Event(_Map::EVENT_SCRIPT, 1), Position)) {
						if(Player->Position == Position)
							BotState = BotStateType::MOVE_HEAL;
						else
							MoveTo(Player->Position, Position);
					}
				}
				else
					DetermineNextGoal();
			}
		break;
	}

}
Пример #7
0
// Check for events
void _Map::CheckEvents(_Object *Object) {

	// Check for teleporting
	if(Server && Object->TeleportTime == 0.0) {
		Object->TeleportTime = -1.0;
		Object->Status = _Object::STATUS_NONE;
		Server->SpawnPlayer(Object, Object->SpawnMapID, _Map::EVENT_SPAWN);
		return;
	}

	// Handle events
	const _Tile *Tile = &Tiles[Object->Position.x][Object->Position.y];
	switch(Tile->Event.Type) {
		case _Map::EVENT_SPAWN:
			Object->SpawnMapID = NetworkID;
			Object->SpawnPoint = Tile->Event.Data;
		break;
		case _Map::EVENT_MAPENTRANCE:
		case _Map::EVENT_MAPCHANGE:
			if(Server)
				Server->SpawnPlayer(Object, (NetworkIDType)Tile->Event.Data, _Map::EVENT_MAPENTRANCE);
			else
				Object->WaitForServer = true;
		break;
		case _Map::EVENT_VENDOR: {
			if(Server) {
				Object->Vendor = Server->Stats->GetVendor(Tile->Event.Data);

				// Notify client
				_Buffer Packet;
				Packet.Write<PacketType>(PacketType::EVENT_START);
				Packet.Write<uint32_t>(Tile->Event.Type);
				Packet.Write<uint32_t>(Tile->Event.Data);
				Packet.Write<glm::ivec2>(Object->Position);
				Server->Network->SendPacket(Packet, Object->Peer);
			}
			else
				Object->WaitForServer = true;
		} break;
		case _Map::EVENT_TRADER: {
			if(Server) {
				Object->Trader = Server->Stats->GetTrader(Tile->Event.Data);

				// Notify client
				_Buffer Packet;
				Packet.Write<PacketType>(PacketType::EVENT_START);
				Packet.Write<uint32_t>(Tile->Event.Type);
				Packet.Write<uint32_t>(Tile->Event.Data);
				Packet.Write<glm::ivec2>(Object->Position);
				Server->Network->SendPacket(Packet, Object->Peer);
			}
			else
				Object->WaitForServer = true;
		} break;
		case _Map::EVENT_SCRIPT: {
			if(Server)
				Server->RunEventScript(Tile->Event.Data, Object);
		} break;
		case _Map::EVENT_PORTAL: {
			if(Server) {

				// Find matching even/odd event
				FindEvent(_Event(Tile->Event.Type, Tile->Event.Data ^ 1), Object->Position);
				Server->SendPlayerPosition(Object->Peer);
			}
			else
				Object->WaitForServer = true;
		} break;
		case _Map::EVENT_JUMP: {
			if(Server) {

				// Find next jump
				FindEvent(_Event(Tile->Event.Type, Tile->Event.Data + 1), Object->Position);
				Server->SendPlayerPosition(Object->Peer);
			}
			else
				Object->WaitForServer = true;
		} break;
		default:
			if(Server) {
				Object->Vendor = nullptr;
				Object->Trader = nullptr;

				if(Object->NextBattle <= 0) {
					Server->QueueBattle(Object, Tile->Zone, false);
				}
			}
		break;
	}
}
Пример #8
0
void CGame::Event (int ID, int iTyp)
{

	_Event ( ID, iTyp, NULL, 0 );
}