Pserver arena

Posts 1–15 of 15 · Page 1 of 1
Pserver arena
I made this little arena system, atm only supports 1 player at a time, might add that feature later on.
Commands are /arena join and then /arena start
Arena contains 20 rounds, each round theres 1 monster ++, starting at 4, winner of the arena gets 2000 fame





How-to

Go to wServer -> realm -> entities -> player - > Player.Chat.cs and add this command

Code:
            else if (cmd.Equals("arena", StringComparison.OrdinalIgnoreCase))
            { 
                if (args[0] == "join")
                {
                    var check = BattleArena.CheckArena();

                    if (!check)
                    {
                        psr.SendPacket(new NotificationPacket()
                        {
                            ObjectId = Id,
                            Color = new ARGB(0xFF00FF00),
                            Text = "Arena alredy in use!"
                        });
                    }
                    else
                    {
                        BattleArena.Init(psr, Id);
                    }
                }
                else if (args[0] == "start")
                {
                    World world = RealmManager.GetWorld(Owner.Id);
                    if (world.Id == -13)
                    {
                        var start = BattleArena.ArenaUpdate(psr, Id, X, Y, Owner);

                        if (!start)
                        {
                            psr.SendPacket(new NotificationPacket()
                            {
                                ObjectId = Id,
                                Color = new ARGB(0xFF00FF00),
                                Text = "Arena alredy started!"
                            });
                        }
                        else
                        {
                            psr.SendPacket(new NotificationPacket()
                            {
                                ObjectId = Id,
                                Color = new ARGB(0xFF00FF00),
                                Text = "Starting arena, good luck!"
                            });

                            new Thread(BattleArena.ArenaGame).Start();
                            
                        }
                    }
                    else
                    {
                        psr.SendPacket(new NotificationPacket()
                        {
                            ObjectId = Id,
                            Color = new ARGB(0xFF00FF00),
                            Text = "You should first /arena join"
                        });
                    }
                }
            }
Also add this at top of the File

Code:
using System.Threading;
Then create a new class at your wServer called BattleArena.cs and add this

Code:
using System.Text;
using wServer.svrPackets;
using wServer.realm;
using System.Threading;
using db;

namespace wServer
{
    class BattleArena
    {
        public static bool on;
        public static bool start;
        public static ClientProcessor psr;
        public static int Id;
        public static int count = 0;
        public static int monsters = 2;
        public static float X;
        public static float Y;
        public static World Owner;
        public static bool running;
        public static string name;

        public static void Init(ClientProcessor newPsr, int newId)
        {
            on = true;
            Id = newId;
            psr = newPsr;
            running = true;

            foreach (var e in RealmManager.Clients.Values.ToArray())
            {
                e.SendPacket(new TextPacket()
                {
                    BubbleTime = 0,
                    Stars = -1,
                    Name = "@Arena",
                    Text = "Player : " + psr.Account.Name + " entered the arena!"
                });
            }

            psr.Reconnect(new ReconnectPacket()
            {
                Host = "",
                Port = 2050,
                GameId = World.BEACHZONE_ID,
                Name = "Arena",
                Key = Empty<byte>.Array,
            });

            psr.SendPacket(new TextPacket()
            {
                BubbleTime = 0,
                Stars = -1,
                Name = "@Arena",
                Text = "You entered the arena"
            });
        }

        public static bool ArenaUpdate(ClientProcessor newPsr, int newId, float newX, float newY, World newOwner)
        {
            if (start)
            {
                return false;
            }
            else
            {
                X = newX;
                Y = newY;
                Owner = newOwner;
                psr = newPsr;
                Id = newId;
                start = true;
                return true;
            }

        }

        public static bool CheckArena()
        {
            if (on)
            {
                return false;
            }
            else
            {
                on = true;
                return true;
            }
        }

        public static void ArenaGame()
        {
            while (running)
            {
                if (Owner.Enemies.Count == 0)
                {
                    if (count == 20)
                    {
                        foreach (var i in RealmManager.Clients.Values.ToArray())
                        {
                            i.SendPacket(new TextPacket()
                            {
                                Name = "@Arena",
                                Stars = -1,
                                BubbleTime = 0,
                                Recipient = "",
                                Text = "Player : " + psr.Account.Name + " won the arena! 2000 fame earned",
                                CleanText = "Player : " + psr.Account.Name + " won the arena! 2000 fame earned"
                            });
                        }

                        using (var dbx = new Database())
                        {
                            dbx.UpdateFame(psr.Account, 2000);
                        }
                        running = false;
                    }

                    count = count + 1;
                    monsters = monsters + 1;
                    
                    psr.SendPacket(new NotificationPacket()
                    {
                        ObjectId = Id,
                        Color = new ARGB(0xFF00FF00),
                        Text = "Starting round : " + count
                    });

                    switch (count)
                    {
                        case 1:
                            name = "Tawny Warg";
                            break;
                        case 2:
                            name = "Demon Warg";
                            break;
                        case 3:
                            name = "Orc Mage";
                            break;
                        case 4:
                            name = "Orc Warrior";
                            break;
                        case 5:
                            name = "Orc King";
                            break;
                        default:
                            name = "Sheep";
                            break;
                    }

                    short objType;
                    if (!XmlDatas.IdToType.TryGetValue(name, out objType) || !XmlDatas.ObjectDescs.ContainsKey(objType))
                    {
                        psr.SendPacket(new TextPacket()
                        {
                            BubbleTime = 0,
                            Stars = -1,
                            Name = "",
                            Text = "Unknown entity!"
                        });
                    }
                    else
                    {
                        for (int i = 0; i <= monsters; i++)
                        {
                            var entity = Entity.Resolve(objType);
                            entity.Move(X, Y);
                            Owner.EnterWorld(entity);
                        }
                    }
                }

                if (Owner.Players.Count == 0)
                {
                    foreach (var i in RealmManager.Clients.Values.ToArray())
                    {
                        i.SendPacket(new TextPacket()
                        {
                            Name = "@Arena",
                            Stars = -1,
                            BubbleTime = 0,
                            Recipient = "",
                            Text = "Player : " + psr.Account.Name + " failed at the arena!",
                            CleanText = "Player : " + psr.Account.Name + " failed at the arena!"
                        });
                    }

                    running = false;
                }
                
                Thread.Sleep(4000);  
            }

            foreach (var i in Owner.Enemies)
            {
                Owner.LeaveWorld(i.Value);
            }

            on = false;
            start = false;
            count = 0;
            monsters = 4;

            psr.Reconnect(new ReconnectPacket()
            {
                Host = "",
                Port = 2050,
                GameId = World.NEXUS_ID,
                Name = "Nexus",
                Key = Empty<byte>.Array,
            });
        }
    }
}
To edit the monsters that appear on each round just edit this part of the BattleArena.cs

case number: means the round number and name means the monster name.

Code:
switch (count)
                    {
                        case 1:
                            name = "Tawny Warg";
                            break;
                        case 2:
                            name = "Demon Warg";
                            break;
                        case 3:
                            name = "Orc Mage";
                            break;
                        case 4:
                            name = "Orc Warrior";
                            break;
                        case 5:
                            name = "Orc King";
                            break;
                        default:
                            name = "Sheep";
                            break;
                    }
To edit the total rounds just edit

where the number = the max rounds

Code:
if (count == 20)
To edit the fame earned just edit

Where 2000 is the fame earned

Code:
dbx.UpdateFame(psr.Account, 2000);
Important

Current map used is beachzone if you want to change it you will need to edit a few things ( use a map with no monsters on it !!! )

Where it says ( on BattleArena.cs )

Code:
psr.Reconnect(new ReconnectPacket()
            {
                Host = "",
                Port = 2050,
                GameId = World.BEACHZONE_ID,
                Name = "Arena",
                Key = Empty<byte>.Array,
            });
Change GameId = World.YOURMAP,

Where it says ( on Player.Chat.cs )

Code:
if (world.Id == -13)
Change -13 for the id of the world you want.

And thats it, if Im missing something just say ( was a long thread ).
Thanks !
btw not for Ossimcs server files
Quote Originally Posted by Fightera100 View Post
btw not for Ossimcs server files
@Fightera100 got it to work with ossi's files!
Quote Originally Posted by Fightera100 View Post
btw not for Ossimcs server files
works for my files, you only have to edit some things
i have a probleme with arena .... look help me please
Quote Originally Posted by fenx95 View Post
i have a probleme with arena .... look help me please
Thats very weird, I dont really know whats the problem, since at my compiler it doesnt show any errors + it works well..

Quote Originally Posted by fenx95 View Post
i have a probleme with arena .... look help me please
Tried to remove .ToArray() ?
I get a problem when I try to connect, it tells me I'm connecting to an invalid world. The map I created works, has a key and portal. I changed "BEACHZONE_ID" to "ARENA_ID", which my map is called Arena. I made ARENA_ID equal to -51, replaced -13 with -51. I don't know what I did wrong.
Well the Invalid world error has nothing to do with the arena system, check if it works using a normal map like the beachzone or the wine cellar, if it works then you should re-do your map..
Posts 1–15 of 15 · Page 1 of 1
This thread is closed for replies.

Similar Threads

Tags for this Thread

None

Need help?