Beispiel #1
0
 public static void SendTo(YiObj player, string message, MsgTextType action)
 {
     if (string.IsNullOrEmpty(message))
     {
         return;
     }
     player.GetMessage(Constants.System, player.Name, message, action);
 }
Beispiel #2
0
        private static bool CanAttackPhysical(YiObj attacker, YiObj target)
        {
            try
            {
                var conditions = new[]
                {
                    !target.HasFlag(StatusEffect.SpawnProtection),
                    VerifyPkMode(attacker, target),
                    Position.GetDistance(attacker, target) <= attacker.AttackRange,
                    target.Alive,
                    attacker.Alive
                };

                if (GameWorld.Maps.TryGetValue(attacker.MapId, out var map))
                {
                    if (map.Flags.HasFlag(MapFlags.NewbieProtect) && target.Level < 27 && target is Player)
                    {
                        attacker.GetMessage("SYSTEM", attacker.Name.TrimEnd('\0'), "You can't attack players below level 27 here.", MsgTextType.Action);
                        return(false);
                    }
                    if (map.Flags.HasFlag(MapFlags.NoPk) && target is Player)
                    {
                        attacker.GetMessage("SYSTEM", attacker.Name.TrimEnd('\0'), "You can't attack players here.", MsgTextType.Action);
                        return(false);
                    }
                }

                return(Conditions.True(conditions));
            }
            catch (Exception e)
            {
                if (Debugger.IsAttached)
                {
                    Output.WriteLine($"[CanAttack] {e.Message} \r\n {e.StackTrace}");
                }
                return(false);
            }
        }
Beispiel #3
0
        public static void Pickup(YiObj picker, int itemId)
        {
            if (!FloorItems.TryGetValue(itemId, out var drop))
            {
                return;
            }

            if (drop.Owner != null)
            {
                if (picker.UniqueId != drop.Owner.UniqueId)
                {
                    if (TeamSystem.MemberOfTeam(picker.UniqueId, drop.Owner.UniqueId, out var teamData2))
                    {
                        if (drop.Money > 0 && teamData2.MoneyLocked)
                        {
                            Message.SendTo(picker, $"This item belongs to {drop.Owner.Name.TrimEnd('\0')}", MsgTextType.Action);
                            return;
                        }

                        if (teamData2.ItemsLocked)
                        {
                            Message.SendTo(picker, $"This item belongs to {drop.Owner.Name.TrimEnd('\0')}", MsgTextType.Action);
                            return;
                        }
                    }
                }
            }

            if (drop.Amount > 0)
            {
                picker.Money += drop.Amount;

                AbortJobs(drop);
                drop.Destroy();
                if (drop.Amount > 2000)
                {
                    ScreenSystem.Send(picker, MsgAction.CashEffect(picker, drop.Amount), true);
                }
                picker.GetMessage(Constants.System, picker.Name, $"You've picked up {drop.Amount:##,###} gold.", MsgTextType.Top);
            }
            else if (picker.Inventory.AddItem(drop.Original))
            {
                AbortJobs(drop);
                drop.Destroy();
            }
        }
Beispiel #4
0
        private static void Process(YiObj target, YiObj invoker, cq_action cqaction, SquigglyContext db)
        {
            if (cqaction == null || cqaction.id == 0)
            {
                return;
            }

            invoker.CurrentAction = cqaction;
            var type = (Cq_ActionId)cqaction.type;

            //Output.WriteLine($"Mob Action -> Type: {type}:{(int) type} Data: {cqaction.data} Param: {cqaction.param.Trim()}");

            switch (type)
            {
            default:
            {
                Output.WriteLine($"Unknown Cq_ActionId -> {cqaction}", ConsoleColor.Blue);
                break;
            }

            case Cq_ActionId.ACTION_MENUTEXT:
            {
                if (invoker is Player player)
                {
                    player.Send(LegacyPackets.NpcSay(cqaction.param.Trim().Replace("~", " ")));
                    if (cqaction.id_next == 0)
                    {
                        player.Send(LegacyPackets.NpcFinish());
                    }
                    else
                    {
                        Process(target, invoker, db.cq_action.Find(cqaction.id_next), db);
                    }
                }

                break;
            }

            case Cq_ActionId.ACTION_MENULINK:
            {
                if (invoker is Player player)
                {
                    var option   = cqaction.param.Trim().Split(' ')[0];
                    var sControl = cqaction.param.Split(' ', StringSplitOptions.RemoveEmptyEntries);
                    var control  = int.Parse(sControl[1]);

                    player.NpcTasks.Add((byte)player.NpcTasks.Count, (int)control);

                    player.Send(LegacyPackets.NpcLink(option.Replace("~", " "), (byte)(player.NpcTasks.Count - 1)));
                    if (cqaction.id_next == 0)
                    {
                        player.Send(LegacyPackets.NpcFinish());
                    }
                    else
                    {
                        Process(target, invoker, db.cq_action.Find(cqaction.id_next), db);
                    }
                }

                break;
            }

            case Cq_ActionId.ACTION_MENUPIC:
            {
                if (invoker is Player player)
                {
                    var faceId = byte.Parse(cqaction.param.Trim().Split(' ')[2]);
                    player.Send(LegacyPackets.NpcFace(faceId));
                    if (cqaction.id_next == 0)
                    {
                        player.Send(LegacyPackets.NpcFinish());
                    }
                    else
                    {
                        Process(target, invoker, db.cq_action.Find(cqaction.id_next), db);
                    }
                }
                break;
            }

            case Cq_ActionId.ACTION_MENUCREATE:
            {
                if (invoker is Player player)
                {
                    player.Send(LegacyPackets.NpcFinish());
                }
                break;
            }

            case Cq_ActionId.ACTION_USER_SEX:
            {
                if (cqaction.id_nextfail == 0 && cqaction.id_next == 0)
                {
                    return;
                }

                //If male next_id else nextid_fail

                break;
            }

            case Cq_ActionId.ACTION_ITEM_CHECK:
            {
                ACTION_ITEM_CHECK(target, invoker, cqaction, db);
                break;
            }

            case Cq_ActionId.ACTION_MST_DROPITEM:
            {
                ACTION_MST_DROPITEM(target, invoker, cqaction, db);
                break;
            }

            case Cq_ActionId.ACTION_RAND:
            {
                ACTION_RAND(target, invoker, cqaction, db);
                break;
            }

            case Cq_ActionId.ACTION_USER_ATTR:
            {
                ACTION_USER_ATTR(target, invoker, cqaction, db);
                break;
            }

            case Cq_ActionId.ACTION_RANDACTION:
            {
                ACTION_RANDACTION(target, invoker, cqaction, db);
                break;
            }

            case Cq_ActionId.ACTION_USER_TALK:
            {
                invoker.GetMessage("SYSTEM", invoker.Name.Trim(), cqaction.param.Trim().Replace("~", ""), (MsgTextType)cqaction.data);
                break;
            }

            case Cq_ActionId.ACTION_USER_HAIR:
            {
                ACTION_USER_HAIR(target, invoker, cqaction, db);
                break;
            }

            case Cq_ActionId.ACTION_USER_MEDIAPLAY:
            {
                ACTION_USER_MEDIAPLAY(target, invoker, cqaction, db);
                break;
            }

            case Cq_ActionId.ACTION_USER_EFFECT:
            {
                ACTION_USER_EFFECT(target, invoker, cqaction, db);
                break;
            }

            case Cq_ActionId.ACTION_USER_CHGMAP:
            {
                ACTION_USER_CHGMAP(target, invoker, cqaction, db);
                break;
            }

            case Cq_ActionId.ACTION_ITEM_LEAVESPACE:
                ACTION_ITEM_LEAVESPACE(target, invoker, cqaction, db);
                break;

            case Cq_ActionId.ACTION_ITEM_ADD:
                ACTION_ITEM_ADD(target, invoker, cqaction, db);
                break;

            case Cq_ActionId.ACTION_ITEM_MULTICHK:
                ACTION_ITEM_MULTICHK(target, invoker, cqaction, db);
                break;

            case Cq_ActionId.ACTION_ITEM_MULTIDEL:
                ACTION_ITEM_MULTIDEL(target, invoker, cqaction, db);
                break;

            case Cq_ActionId.ACTION_CHKTIME:
                ACTION_CHKTIME(target, invoker, cqaction, db);
                break;

            case Cq_ActionId.ACTION_USER_MAGIC:
                ACTION_USER_MAGIC(target, invoker, cqaction, db);
                break;
            }
        }