void NotifyPlayers(Server server, int clientid) { ClientOnServer c = server.clients[clientid]; // EntitySpawn foreach (var k in server.clients) { if (k.Value.state != ClientStateOnServer.Playing) { continue; } if (c.playersDirty[k.Key]) { Packet_ServerEntity e = ToNetworkEntity(server.serverPlatform, k.Value.entity); server.SendPacket(clientid, ServerPackets.EntitySpawn(k.Key, e)); c.playersDirty[k.Key] = false; } } }
void NotifyEntities(Server server, int clientid, float dt) { ClientOnServer c = server.clients[clientid]; c.notifyEntitiesAccum += dt; if (c.notifyEntitiesAccum < (one / EntityPositionUpdatesPerSecond)) { return; } c.notifyEntitiesAccum = 0; // find nearest entities int max = SpawnMaxEntities; ServerEntityId[] nearestEntities = new ServerEntityId[max]; FindNearEntities(server, c, max, nearestEntities); // update entities for (int i = 0; i < max; i++) { ServerEntityId e = nearestEntities[i]; if (e == null) { continue; } for (int k = 0; k < server.modEventHandlers.onentityupdate.Count; k++) { server.modEventHandlers.onentityupdate[k](e); } } // despawn old entities for (int i = 0; i < c.spawnedEntitiesCount; i++) { ServerEntityId e = c.spawnedEntities[i]; if (e == null) { continue; } if (!Contains(nearestEntities, max, e)) { int onClientId = i; c.spawnedEntities[onClientId] = null; server.SendPacket(clientid, ServerPackets.EntityDespawn(64 + onClientId)); } } // spawn new entities for (int i = 0; i < max; i++) { ServerEntityId e = nearestEntities[i]; if (e == null) { continue; } if (!Contains(c.spawnedEntities, max, e)) { int onClientId = IndexOfNull(c.spawnedEntities, c.spawnedEntitiesCount); c.spawnedEntities[onClientId] = e.Clone(); ServerChunk chunk = server.d_Map.GetChunk(e.chunkx * Server.chunksize, e.chunky * Server.chunksize, e.chunkz * Server.chunksize); ServerEntity ee = chunk.Entities[e.id]; Packet_ServerEntity ne = ToNetworkEntity(server.serverPlatform, ee); server.SendPacket(clientid, ServerPackets.EntitySpawn(64 + onClientId, ne)); } } for (int i = 0; i < max; i++) { if (c.updateEntity[i]) { c.updateEntity[i] = false; ServerEntityId e = c.spawnedEntities[i]; ServerChunk chunk = server.d_Map.GetChunk(e.chunkx * Server.chunksize, e.chunky * Server.chunksize, e.chunkz * Server.chunksize); ServerEntity ee = chunk.Entities[e.id]; Packet_ServerEntity ne = ToNetworkEntity(server.serverPlatform, ee); server.SendPacket(clientid, ServerPackets.EntitySpawn(64 + i, ne)); } } }
void ProcessPacket(int client, Packet_Client packet) { switch (packet.GetId()) { case Packet_ClientIdEnum.PlayerIdentification: { if (packet.Identification == null) { return; } SendPacket(client, ServerPackets.Identification(0, MapSizeX, MapSizeY, MapSizeZ, platform.GetGameVersion())); clients[client].Name = packet.Identification.Username; } break; case Packet_ClientIdEnum.RequestBlob: { SendPacket(client, ServerPackets.LevelInitialize()); for (int i = 0; i < blockTypesCount; i++) { Packet_BlockType blocktype = blockTypes[i]; if (blocktype == null) { blocktype = new Packet_BlockType(); } SendPacket(client, ServerPackets.BlockType(i, blocktype)); } SendPacket(client, ServerPackets.BlockTypes()); SendPacket(client, ServerPackets.LevelFinalize()); for (int i = 0; i < clientsCount; i++) { if (clients[i] == null) { continue; } clients[i].glX = spawnGlX; clients[i].glY = spawnGlY; clients[i].glZ = spawnGlZ; Packet_PositionAndOrientation pos = new Packet_PositionAndOrientation(); pos.X = platform.FloatToInt(32 * clients[i].glX); pos.Y = platform.FloatToInt(32 * clients[i].glY); pos.Z = platform.FloatToInt(32 * clients[i].glZ); pos.Pitch = 255 / 2; //SendPacket(client, ServerPackets.Spawn(i, clients[i].Name, pos)); Packet_ServerEntity e = new Packet_ServerEntity(); e.DrawModel = new Packet_ServerEntityAnimatedModel(); e.DrawModel.Model_ = "player.txt"; e.DrawModel.ModelHeight = platform.FloatToInt((one * 17 / 10) * 32); e.DrawModel.EyeHeight = platform.FloatToInt((one * 15 / 10) * 32); e.Position = pos; SendPacket(client, ServerPackets.EntitySpawn(0, e)); SendPacket(client, ServerPackets.PlayerStats(100, 100, 100, 100)); } for (int i = 0; i < modsCount; i++) { mods[i].OnPlayerJoin(client); } clients[client].connected = true; } break; case Packet_ClientIdEnum.Message: { SendPacketToAll(ServerPackets.Message(platform.StringFormat2("{0}: &f{1}", clients[client].Name, packet.Message.Message))); } break; case Packet_ClientIdEnum.SetBlock: { int x = packet.SetBlock.X; int y = packet.SetBlock.Y; int z = packet.SetBlock.Z; int block = packet.SetBlock.BlockType; int mode = packet.SetBlock.Mode; if (mode == Packet_BlockSetModeEnum.Create) { } if (mode == Packet_BlockSetModeEnum.Destroy) { SendPacketToAll(ServerPackets.SetBlock(x, y, z, 0)); } if (mode == Packet_BlockSetModeEnum.Use) { } if (mode == Packet_BlockSetModeEnum.UseWithTool) { } } break; case Packet_ClientIdEnum.PositionandOrientation: { clients[client].glX = one * packet.PositionAndOrientation.X / 32; clients[client].glY = one * packet.PositionAndOrientation.Y / 32; clients[client].glZ = one * packet.PositionAndOrientation.Z / 32; } break; case Packet_ClientIdEnum.InventoryAction: { switch (packet.InventoryAction.Action) { case Packet_InventoryActionTypeEnum.Click: break; } } break; } }