コード例 #1
0
    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
                           ));
    }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: Map.cs プロジェクト: tuita520/PolarisServer
        /// <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;
            }
        }
コード例 #5
0
        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);
        }