private void OnCharacterSpawnPacketReceived(CharacterSpawnPacket packet) { Debug.Log("Received a CharacterSpawnPacket:" + packet.GetId()); GameObject instance = Instantiate(characterPrefab, transform); Character character = instance.GetComponent <Character>(); Color color; if (karmanClient.id.Equals(packet.GetClientId())) { character.enabled = true; color = packet.GetColor(); } else { Destroy(character.GetComponent <Rigidbody2D>()); Destroy(character); color = packet.GetColor(); color.a = 0.3f; } characters.Add(packet.GetId(), new CharacterData( packet.GetId(), packet.GetClientId(), packet.GetPosition(), color, instance )); }
public override void HandlePacket(Client context, byte[] data, uint position, uint size) { if (context.User == null || context.Character == null) { return; } // Looks/Jobs if (size > 0) { PacketReader reader = new PacketReader(data); reader.BaseStream.Seek(0x38, SeekOrigin.Begin); context.Character.Looks = reader.ReadStruct <Character.LooksParam>(); context.Character.Jobs = reader.ReadStruct <Character.JobParam>(); PolarisApp.Instance.Database.ChangeTracker.DetectChanges(); } // Set Area byte[] setAreaPacket = File.ReadAllBytes("Resources/testSetAreaPacket.bin"); context.SendPacket(0x03, 0x24, 4, setAreaPacket); // Set Player ID PacketWriter setPlayerID = new PacketWriter(); setPlayerID.WritePlayerHeader((uint)context.User.PlayerID); context.SendPacket(0x06, 0x00, 0, setPlayerID.ToArray()); // Spawn Lobby Objects if (Directory.Exists("Resources/objects/lobby")) { string[] objectPaths = Directory.GetFiles("Resources/objects/lobby"); Array.Sort(objectPaths); foreach (var path in objectPaths) { context.SendPacket(File.ReadAllBytes(path)); } } else { Logger.WriteWarning("Directory 'Resources/objects/lobby' not found!"); } // Spawn Character context.SendPacket(new CharacterSpawnPacket(context.Character)); // Unlock Controls context.SendPacket(new NoPayloadPacket(0x03, 0x2B)); // Spawn on other player's clients CharacterSpawnPacket spawnPacket = new CharacterSpawnPacket(context.Character); spawnPacket.IsItMe = false; foreach (Client c in Server.Instance.Clients) { if (c == context) { continue; } if (c.Character == null) { continue; } c.SendPacket(spawnPacket); CharacterSpawnPacket remoteChar = new CharacterSpawnPacket(c.Character); remoteChar.IsItMe = false; context.SendPacket(remoteChar); } // memset packet - Enables menus // Also holds event items and likely other stuff too byte[] memSetPacket = File.ReadAllBytes("Resources/setMemoryPacket.bin"); context.SendPacket(0x23, 0x07, 0, memSetPacket); // Give a blank palette context.SendPacket(new PalettePacket()); Logger.Write("[CHR] {0}'s character {1} has spawned", context.User.Username, context.Character.Name); }
private void SpawnClone(string[] args, int length, string full, Client client) { // Temporary haxifications to pull your own connection var name = args[1].Trim('\"'); var playerName = args[2].Trim('\"'); var x = float.Parse(args[3]); var y = float.Parse(args[4]); var z = float.Parse(args[5]); if (client == null) { var foundPlayer = false; // Find the player var id = Helper.FindPlayerByUsername(name); if (id != -1) { foundPlayer = true; } // Couldn't find the username if (!foundPlayer) { Logger.WriteError("[CMD] Could not find user " + name); return; } client = PolarisApp.Instance.Server.Clients[id]; } // Default coordinates if (x == 0) { x = -0.417969f; } if (y == 0) { y = 0.000031f; } if (z == 0) { z = 134.375f; } var fakePlayer = new Player { Username = name, Nickname = playerName, PlayerID = (12345678 + new Random().Next()) }; var fakeChar = new Character { CharacterID = 12345678 + new Random().Next(), Player = fakePlayer, Name = playerName, Looks = client.Character.Looks, Jobs = client.Character.Jobs }; var fakePacket = new CharacterSpawnPacket(fakeChar, new PSOLocation(0f, 1f, 0f, 0f, x, y, z)) { IsItMe = false }; client.SendPacket(fakePacket); Logger.WriteCommand(client, "[CMD] Spawned a clone of {0} named {1}", name, playerName); }
/// <summary> /// Spawns a client into a map at a given location /// </summary> /// <param name="c">Client to spawn into map</param> /// <param name="location">Location to spawn client at</param> /// <param name="questOveride">If this also sets the quest data, specify the quest name here to load the spawn from the bin rather then generate it.</param> public void SpawnClient(Client c, PSOLocation location, string questOveride = "") { if (Clients.Contains(c)) { return; } // Set area if (questOveride != "") // TODO: This is a temporary hack, fix me!! { var setAreaPacket = File.ReadAllBytes("Resources/quests/" + questOveride + ".bin"); c.SendPacket(0x03, 0x24, 4, setAreaPacket); } else { PacketWriter writer = new PacketWriter(); writer.WriteStruct(new ObjectHeader(3, EntityType.Map)); writer.WriteStruct(new ObjectHeader((uint)c.User.PlayerId, EntityType.Player)); writer.Write(0x1); // 8 Zeros writer.Write(0); // 8 Zeros writer.Write(~(uint)Type); // F4 FF FF FF writer.Write(MapID); // Map ID maybe writer.Write((uint)Flags); writer.Write(GenerationArgs.seed); // 81 8F E6 19 (Maybe seed) writer.Write(VariantID); // Randomgen enable / disable maybe writer.Write(GenerationArgs.xsize); // X Size writer.Write(GenerationArgs.ysize); // Y Size writer.Write(1); writer.Write(1); writer.Write(~0); // FF FF FF FF FF FF FF FF writer.Write(0x301); c.SendPacket(0x3, 0x0, 0x0, writer.ToArray()); } if (c.CurrentZone != null) { c.CurrentZone.RemoveClient(c); } var setPlayerId = new PacketWriter(); setPlayerId.WritePlayerHeader((uint)c.User.PlayerId); c.SendPacket(0x06, 0x00, 0, setPlayerId.ToArray()); // Spawn Character c.SendPacket(new CharacterSpawnPacket(c.Character, location)); c.CurrentLocation = location; c.CurrentZone = this; // Objects foreach (PSOObject obj in Objects) { c.SendPacket(0x08, 0x0B, 0x0, obj.GenerateSpawnBlob()); } // NPCs foreach (PSONPC npc in NPCs) { c.SendPacket(0x08, 0xC, 0x4, npc.GenerateSpawnBlob()); } // Spawn for others, Spawn others for me CharacterSpawnPacket spawnMe = new CharacterSpawnPacket(c.Character, location, false); foreach (Client other in Clients) { other.SendPacket(spawnMe); c.SendPacket(new CharacterSpawnPacket(other.Character, other.CurrentLocation, false)); } // Unlock Controls c.SendPacket(new NoPayloadPacket(0x03, 0x2B)); // Inital spawn only, move this! Clients.Add(c); Logger.Write("[MAP] {0} has spawned in {1}.", c.User.Username, Name); if (InstanceName != null && ZoneManager.Instance.playerCounter.ContainsKey(InstanceName)) { ZoneManager.Instance.playerCounter[InstanceName] += 1; } }
public override void HandlePacket(Client context, byte[] data, uint position, uint size) { if (context.User == null || context.Character == null) { return; } // Looks/Jobs if (size > 0) { var reader = new PacketReader(data); reader.BaseStream.Seek(0x38, SeekOrigin.Begin); context.Character.Looks = reader.ReadStruct <Character.LooksParam>(); context.Character.Jobs = reader.ReadStruct <Character.JobParam>(); PolarisApp.Instance.Database.ChangeTracker.DetectChanges(); } // Set Area var setAreaPacket = File.ReadAllBytes("Resources/testSetAreaPacket.bin"); context.SendPacket(0x03, 0x24, 4, setAreaPacket); // Set Player ID var setPlayerId = new PacketWriter(); setPlayerId.WritePlayerHeader((uint)context.User.PlayerId); context.SendPacket(0x06, 0x00, 0, setPlayerId.ToArray()); // Spawn Lobby Objects if (Directory.Exists("Resources/objects/lobby")) { var objectPaths = Directory.GetFiles("Resources/objects/lobby"); Array.Sort(objectPaths); foreach (var path in objectPaths) { if (Path.GetExtension(path) == "bin") { Logger.WriteWarning("Object {0} is still in BIN format and should be migrated to JSON!", path); context.SendPacket(File.ReadAllBytes(path)); } else if (Path.GetExtension(path) == "json") { var newObject = JsonConvert.DeserializeObject <PsoObject>(File.ReadAllText(path)); context.SendPacket(0x08, 0x0B, 0x0, newObject.GenerateSpawnBlob()); } } } else { Logger.WriteWarning("Directory 'Resources/objects/lobby' not found!"); } // Spawn Character context.SendPacket(new CharacterSpawnPacket(context.Character)); // Unlock Controls context.SendPacket(new NoPayloadPacket(0x03, 0x2B)); // Spawn on other player's clients var spawnPacket = new CharacterSpawnPacket(context.Character) { IsItMe = false }; foreach (var c in Server.Instance.Clients.Where(c => c != context).Where(c => c.Character != null)) { c.SendPacket(spawnPacket); var remoteChar = new CharacterSpawnPacket(c.Character) { IsItMe = false }; context.SendPacket(remoteChar); } // memset packet - Enables menus // Also holds event items and likely other stuff too var memSetPacket = File.ReadAllBytes("Resources/setMemoryPacket.bin"); context.SendPacket(0x23, 0x07, 0, memSetPacket); // Give a blank palette context.SendPacket(new PalettePacket()); Logger.Write("[CHR] {0}'s character {1} has spawned", context.User.Username, context.Character.Name); }