예제 #1
0
        static void OnGroupCreate(WORLDMSG msgID, BinReader data)
        {
            uint        charID   = data.ReadUInt32();
            WorldClient client   = WorldServer.GetClientByCharacterID(charID);
            uint        leaderID = data.ReadUInt32();
            WorldClient leader   = WorldServer.GetClientByCharacterID(leaderID);

            if (leader == null)
            {
                Console.WriteLine("Leader not found");
                return;
            }

            if (leader.Player.Group == null)
            {
                leader.Player.Group = new GroupObject(client.Player, leader.Player);
            }
            else
            {
                for (uint i = 0; i < leader.Player.Group.Size; i++)
                {
                    if (leader.Player.Group.Members[i].CharacterID == charID)
                    {
                        return;
                    }
                }
                leader.Player.Group.AddMember(client.Player);
            }

            client.Player.Group            = leader.Player.Group;
            leader.Player.IsLeader         = true;
            client.Player.Group.LeaderGUID = leader.Player.GUID;
            client.Player.Group.SendGroupList();
        }
예제 #2
0
            public CombatEvent(PlayerObject player) : base(TimeSpan.FromMilliseconds(1))
            {
                aclient = WorldServer.GetClientByCharacterID((uint)player.GUID);
                aclient.Player.LastPosition = aclient.Player.Position;

                //target = (LivingObject)ObjectManager.GetWorldObjectByGUID(aclient.Player.Target);
                //Console.WriteLine("New combat event attacker: " + player.Name + " -> " + target.Name);
            }
예제 #3
0
        public override void FireEvent()
        {
            // Mob has changed target
            if (this.currenttarget != mob.Target)
            {
                client = (WorldClient)WorldServer.GetClientByCharacterID((uint)this.mob.Target);
                if (client == null)
                {
                    this.mob.StopCombat();
                }
                else
                {
                    this.currenttarget = mob.Target;
                }
            }
            //Console.WriteLine("ChasingEvent.FireEvent (" + (client != null ? client.Player.Name : "") + "): " + mob.Name);

            if (client != null && client.Player.InWorld && !client.Player.Dead && !mob.Dead)
            {
                try
                {
                    float distance = client.Player.Position.Distance(mob.Position);
                    //				if(distance > 4)
                    //				{
                    int          time = (int)((distance / mob.RunningSpeed) * 1000);
                    ServerPacket pkg  = new ServerPacket(SMSG.MONSTER_MOVE);
                    pkg.Write((char)0xFF);
                    pkg.Write(mob.GUID);
                    pkg.WriteVector(mob.Position);
                    pkg.Write(mob.Facing);
                    pkg.Write((byte)0);
                    pkg.Write(0x100);
                    pkg.Write(time);
                    pkg.Write(1);
                    if (client != null && client.Player != null)
                    {
                        mob.Position.Translate(client.Player.Position, 1.5f - (client.Player.Position.Distance(client.Player.LastPosition) * 0.5f));
                    }

                    pkg.Write(mob.Position.X);
                    pkg.Write(mob.Position.Y);
                    pkg.Write(mob.Position.Z);
                    pkg.Finish();
                    mob.MapTile.SendSurrounding(pkg);
                    mob.UpdateData();
                    client.Player.UpdateData();
                }
                catch (Exception exp)
                {
                    DebugLogger.Logger.Log("", exp);
                }
                //				eventTime = DateTime.Now.Add(TimeSpan.FromSeconds(1));
                //				EventManager.AddEvent(this);
            }
        }
예제 #4
0
        static void OnPlayerLeaveWorld(WORLDMSG msgID, BinReader data)
        {
            uint        id     = data.ReadUInt32();
            WorldClient client = WorldServer.GetClientByCharacterID(id);

            if (client == null)
            {
                Console.WriteLine("Failed to leave world. Client didn't exist on worldserver.");
                return;
            }
            client.LeaveWorld();
        }
예제 #5
0
        public void updateTime()
        {
            BinWriter w = new BinWriter();

            w.Write(WorldClock.GetTimeStamp());
            WorldServer.GetClientByCharacterID((uint)this.GUID).Send(SMSG.GAMETIME_UPDATE, w);

            /*		//BinWriter w = LoginClient.NewPacket(SMSG.LOGIN_SETTIMESPEED);
             *                      /*w.Write((float)0);
             *                      w.Write((int)0);*/
            /*w.Write((byte)1);
             * w.Write((byte)1);
             * w.Write((byte)1);
             * w.Write((byte)1);
             * w.Write((byte)1);
             * w.Write((byte)1);
             * w.Write((byte)1);
             * w.Write((byte)1);
             * Send(w);
             *
             * DateTime time = WorldServer.m_clock.time;	//Moved this code to WorldClock, so I could use the timestamp in other places.
             * uint timeSeq = 0;
             *
             * // 4 bytes of packed time data.  the bits are:
             * // high 2 bits - unknown
             * timeSeq|=(uint)0;
             * // next 5 bits - year
             * timeSeq<<=5;
             * timeSeq|=(uint)1;
             * // next 4 bits - month
             * timeSeq<<=4;
             * timeSeq|=(uint)time.Month;
             * // next 7 bits - day of month
             * timeSeq<<=7;
             * timeSeq|=(uint)time.Day;
             * // next 3 bits - day of week
             * timeSeq<<=3;
             * timeSeq|=(uint)time.DayOfWeek;
             * // next 5 bits - hours
             * timeSeq<<=5;
             * timeSeq|=(uint)((time.Hour==0) ? 24 : time.Hour );
             * // low 6 bits  - minutes
             * timeSeq<<=6;
             * timeSeq|=(uint)time.Minute;
             *
             * BinWriter w = new BinWriter();
             * w.Write(timeSeq);
             * WorldServer.GetClientByCharacterID((uint)this.GUID).Send(SMSG.GAMETIME_UPDATE,w);
             */
        }
예제 #6
0
            public override void FireEvent()
            {
                try
                {
                    attacker.InRound   = false;
                    attacker.DidAttack = false;
                    if (aclient.Player == null)
                    {
                        this.Kill();
                        return;
                    }
                    //Console.WriteLine("CombatEvent.FireEvent (" + aclient.Player.Name + "): " + attacker.Name);

                    aclient = WorldServer.GetClientByCharacterID((uint)attacker.Target);
                    if (attacker.Dead)
                    {
                        this.Kill(); return;
                    }
                    target = aclient.Player;
                }
                catch (Exception) { this.Kill(); return; }

                if (aclient.Player.Position.Distance(attacker.Position) > 50)
                {
                    Console.WriteLine("Ennemy out of range! Stopping attack");
                    this.Kill();
                    return;
                }

                if (aclient.Player.Dead || aclient.Player.RezSickness)
                {
                    this.Kill(); return;
                }

                uint hitflag;
                uint victimstate;
                int  damage;
                int  blocked;

                attacker.InRound = true;
                StatManager.CalculateMeleeDamage(attacker, target, out hitflag, out victimstate, out damage, out blocked);
                if (aclient.Player.Position.Distance(attacker.Position) < 2.75f)                 //So they dont get free hits from 20 feet away
                {
                    attacker.DidAttack = true;
                    ServerPacket pkg2 = new ServerPacket(SMSG.ATTACKERSTATEUPDATE);
                    pkg2.Write((uint)hitflag);
                    pkg2.Write(attacker.GUID);
                    pkg2.Write(target.GUID);
                    pkg2.Write((int)damage);
                    pkg2.Write((byte)1);
                    pkg2.Write((uint)0);
                    pkg2.Write((float)damage);
                    pkg2.Write((int)damage);
                    pkg2.Write((int)0);
                    pkg2.Write((uint)victimstate);
                    pkg2.Write((uint)0);
                    pkg2.Write((uint)0);
                    pkg2.Write((uint)0);
                    pkg2.Write((int)0);
                    pkg2.Finish();
                    attacker.MapTile.Map.Send(pkg2, attacker.Position, 25.0f);

                    target.DealDamage(attacker, damage);
                    if (target.Dead)
                    {
                        attacker.StopCombat();
                    }
                }
                else
                {
                    ChasingEvent chase = new ChasingEvent(attacker);
                    chase.FireEvent();
                }

                int nextEvent = (attacker.DidAttack?attacker.BaseAttackTime:1000);

                eventTime = DateTime.Now.Add(TimeSpan.FromMilliseconds(nextEvent));
                EventManager.AddEvent(this);
                return;
            }
예제 #7
0
 public CombatEvent(UnitBase monster) : base(TimeSpan.FromMilliseconds(1))
 {
     attacker = monster;
     aclient  = (WorldClient)WorldServer.GetClientByCharacterID((uint)attacker.Target);
     //Console.WriteLine("New combat event attacker: " + attacker.Name + " -> " + aclient.Player.Name);
 }
예제 #8
0
        public void DealDamage(PlayerObject pobj, int damage)
        {
            if (!this.Dead)
            {
                if (m_agrotable[pobj.CharacterID] == null)
                {
                    m_agrotable.Add(pobj.CharacterID, damage);
                }
                else
                {
                    int damagedealt = (int)m_agrotable[pobj.CharacterID];
                    damagedealt += damage;
                    m_agrotable[pobj.CharacterID] = damagedealt;
                }

                this.Health -= damage;
                if (this.Health < 1)
                {
                    this.Roaming = false;
                    EventManager.AddEvent(new CorpseDespawnEvent((UnitBase)this));
                    this.Health       = 0;
                    this.StandState   = UNITSTANDSTATE.DEAD;
                    this.Dead         = true;
                    this.DynamicFlags = 1;                     // If set to 1 there will be loot.
                    this.LootOwner    = pobj.GUID;
                    this.UpdateData();

                    try {
                        // Give xp to the right people.
                        int       exp             = StatManager.CalculateExp(this, pobj);
                        int       maxdamage       = 0;
                        Hashtable expdividergroup = new Hashtable();
                        Hashtable expdividersolo  = new Hashtable();
                        foreach (DictionaryEntry de in m_agrotable)
                        {
                            maxdamage += (int)de.Value;
                            WorldClient aclient = WorldServer.GetClientByCharacterID((uint)de.Key);
                            if (aclient.Player.Group == null)
                            {
                                expdividersolo.Add(aclient.Player.CharacterID, (int)de.Value);
                            }
                            else
                            {
                                if (expdividergroup[aclient.Player.Group.LeaderGUID] == null)
                                {
                                    expdividergroup.Add(aclient.Player.Group.LeaderGUID, (int)de.Value);
                                }
                                else
                                {
                                    int damagedealt = (int)expdividergroup[aclient.Player.Group.LeaderGUID];
                                    damagedealt += (int)de.Value;
                                    expdividergroup[aclient.Player.Group.LeaderGUID] = damagedealt;
                                }
                            }
                        }

                        // Solo players
                        foreach (DictionaryEntry de in expdividersolo)
                        {
                            float       expbit  = ((int)de.Value / (float)maxdamage);
                            WorldClient aclient = WorldServer.GetClientByCharacterID((uint)de.Key);
                            if (aclient != null)
                            {
                                aclient.Player.GainXp(Convert.ToInt32(exp * expbit), this.GUID);
                            }
                        }

                        // Group players
                        foreach (DictionaryEntry de in expdividergroup)
                        {
                            WorldClient aclient = WorldServer.GetClientByCharacterID(Convert.ToUInt32((ulong)de.Key));
                            if (aclient != null)
                            {
                                GroupObject gobj   = aclient.Player.Group;
                                float       expbit = (((int)de.Value / (float)maxdamage) / (float)gobj.Size);
                                for (int i = 0; i < gobj.Size; i++)
                                {
                                    gobj.Members[i].GainXp(Convert.ToInt32(exp * expbit), this.GUID);
                                }
                            }
                        }
                    } catch (Exception exp) {
                        DebugLogger.Logger.Log("", exp);
                    }
                }
                else
                {
                    this.UpdateData();
                    if (this.MobsRegenEvent == null)
                    {
                        this.MobsRegenEvent = new MobsRegenEvent(this);
                        EventManager.AddEvent(this.MobsRegenEvent);
                    }
                }
            }
        }