示例#1
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            if (entity == null)
            {
                this._logger.LogError($"Cannot execute {nameof(SpecialEffectSystem)}. Entity is null.");
                return;
            }

            if (!args.GetCheckArguments())
            {
                this._logger.LogError($"Cannot execute {nameof(SpecialEffectSystem)} action: {args.GetType()} due to invalid arguments.");
                return;
            }

            switch (args)
            {
            case SpecialEffectEventArgs e:
                this.StartSpecialEffect(entity, e);
                break;

            case SpecialEffectBaseMotionEventArgs e:
                this.SetStateModeBaseMotion(entity, e);
                break;
            }
        }
示例#2
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            if (!(entity is IPlayerEntity player))
            {
                this._logger.LogError($"Cannot execute Level System. {entity.Object.Name} is not a player.");
                return;
            }

            if (!args.GetCheckArguments())
            {
                this._logger.LogError($"Cannot execute Level System action: {args.GetType()} due to invalid arguments.");
                return;
            }

            switch (args)
            {
            case ExperienceEventArgs e:
                this.GiveExperience(player, e);
                break;

            default:
                this._logger.LogWarning("Unknown level system action type: {0} for player {1}", args.GetType(), entity.Object.Name);
                break;
            }
        }
示例#3
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            if (args == null)
            {
                Logger.LogError($"Cannot execute {nameof(DropSystem)}. Arguments are null.");
                return;
            }

            if (!args.CheckArguments())
            {
                Logger.LogError($"Cannot execute {nameof(DropSystem)} action: {args.GetType()} due to invalid arguments.");
                return;
            }

            switch (args)
            {
            case DropItemEventArgs dropItemEventArgs:
                this.DropItem(entity, dropItemEventArgs);
                break;

            case DropGoldEventArgs dropGoldEventArgs:
                this.DropGold(entity, dropGoldEventArgs);
                break;
            }
        }
示例#4
0
        /// <summary>
        /// Executes the <see cref="VisibilitySystem"/> logic.
        /// </summary>
        /// <param name="entity">Current entity</param>
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            var       currentMap      = entity.Context as IMapInstance;
            IMapLayer currentMapLayer = currentMap?.GetMapLayer(entity.Object.LayerId);

            if (currentMapLayer != null)
            {
                UpdateEntitiesVisibility(entity, currentMapLayer.Entities);
            }

            if (currentMap != null)
            {
                UpdateEntitiesVisibility(entity, currentMap?.Entities);
            }

            if (entity.Type == WorldEntityType.Player)
            {
                foreach (var region in currentMapLayer.Regions)
                {
                    if (!region.IsActive && entity.Object.Position.Intersects(region.GetRectangle(), VisibilityRange))
                    {
                        region.IsActive = true;
                    }

                    if (region.IsActive && region is IMapRespawnRegion respawner)
                    {
                        UpdateEntitiesVisibility(entity, respawner.Entities);
                    }
                }
            }
        }
示例#5
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs e)
        {
            if (!(entity is IPlayerEntity player) ||
                !e.CheckArguments())
            {
                Logger.Error("NpcShopSystem: Invalid event arguments.");
                return;
            }

            switch (e)
            {
            case NpcShopOpenEventArgs npcShopEventArgs:
                this.OpenShop(player, npcShopEventArgs);
                break;

            case NpcShopCloseEventArgs npcShopEventArgs:
                this.CloseShop(player);
                break;

            case NpcShopBuyEventArgs npcShopEventArgs:
                this.BuyItem(player, npcShopEventArgs);
                break;

            case NpcShopSellEventArgs npcShopEventArgs:
                this.SellItem(player, npcShopEventArgs);
                break;

            default:
                Logger.Warn("Unknown NpcShop action type: {0} for player {1}", e.GetType(), entity.Object.Name);
                break;
            }
        }
示例#6
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            if (!(entity is IPlayerEntity player))
            {
                this._logger.LogError($"Cannot execute {nameof(RecoverySystem)}. {entity.Object.Name} is not a player.");
                return;
            }

            if (!args.GetCheckArguments())
            {
                this._logger.LogError($"Cannot execute {nameof(RecoverySystem)} action: {args.GetType()} due to invalid arguments.");
                return;
            }

            switch (args)
            {
            case IdleRecoveryEventArgs e:
                this.IdleHeal(player, e);
                break;

            default:
                this._logger.LogWarning($"Unknown recovery system action type: {args.GetType()} for player {entity.Object.Name}");
                break;
            }
        }
示例#7
0
 public override void Execute(IEntity entity, SystemEventArgs e)
 {
     switch (e)
     {
     case PlayerChatEventArg playerChatEvent:
         PlayerChat(entity, playerChatEvent);
         break;
     }
 }
示例#8
0
 public void NotifySystems(IEntity sender, SystemEventArgs args)
 {
     lock (_systems)
     {
         foreach (var system in _systems)
         {
             system.Value.OnNotification(sender, args);
         }
     }
 }
示例#9
0
 public void NotifySystem <TSystem>(IEntity sender, SystemEventArgs args) where TSystem : ISystem
 {
     lock (_systems)
     {
         if (_systems.TryGetValue(typeof(TSystem), out ISystem system))
         {
             system.OnNotification(sender, args);
         }
     }
 }
 public void OnNotification(IEntity entity, SystemEventArgs args)
 {
     switch (args)
     {
     case ClientConnectedEventArgs ccea:
         entity.Send(new ProtocolRequiredMessage());
         entity.Send(new HelloGameMessage());
         break;
     }
 }
示例#11
0
        /// <summary>
        /// Executes the <see cref="MobilitySystem"/> logic.
        /// </summary>
        /// <param name="entity">Current entity</param>
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            var movableEntity = entity as IMovableEntity;

            if (movableEntity.MovableComponent.DestinationPosition.IsZero())
            {
                return;
            }

            this.Walk(movableEntity);
        }
示例#12
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            if (!(entity is IPlayerEntity player))
            {
                this._logger.LogError($"Cannot execute DeathSystem. {entity.Object.Name} is not a player.");
                return;
            }

            IMapRevivalRegion revivalRegion = player.Object.CurrentMap.GetNearRevivalRegion(player.Object.Position);

            if (revivalRegion == null)
            {
                this._logger.LogError($"Cannot find any revival region for map '{player.Object.CurrentMap.Name}'.");
                return;
            }

            decimal recoveryRate = GameResources.Instance.Penalities.GetRevivalPenality(player.Object.Level) / 100;
            var     jobData      = player.PlayerData.JobData;

            int strength     = player.Attributes[DefineAttributes.STR];
            int stamina      = player.Attributes[DefineAttributes.STA];
            int dexterity    = player.Attributes[DefineAttributes.DEX];
            int intelligence = player.Attributes[DefineAttributes.INT];

            player.Health.Hp = (int)(HealthFormulas.GetMaxOriginHp(player.Object.Level, stamina, jobData.MaxHpFactor) * recoveryRate);
            player.Health.Mp = (int)(HealthFormulas.GetMaxOriginMp(player.Object.Level, intelligence, jobData.MaxMpFactor, true) * recoveryRate);
            player.Health.Fp = (int)(HealthFormulas.GetMaxOriginFp(player.Object.Level, stamina, dexterity, strength, jobData.MaxFpFactor, true) * recoveryRate);

            if (player.Object.MapId != revivalRegion.MapId)
            {
                IMapInstance revivalMap = this._mapLoader.GetMapById(revivalRegion.MapId);

                if (revivalMap == null)
                {
                    this._logger.LogError($"Cannot find revival map with id '{revivalRegion.MapId}'.");
                    player.Connection.Server.DisconnectClient(player.Connection.Id);
                    return;
                }

                revivalRegion = revivalMap.GetRevivalRegion(revivalRegion.Key);
            }

            var teleportEvent = new TeleportEventArgs(revivalRegion.MapId, revivalRegion.RevivalPosition.X, revivalRegion.RevivalPosition.Z);

            player.NotifySystem <TeleportSystem>(teleportEvent);

            WorldPacketFactory.SendMotion(player, ObjectMessageType.OBJMSG_ACC_STOP | ObjectMessageType.OBJMSG_STOP_TURN | ObjectMessageType.OBJMSG_STAND);
            WorldPacketFactory.SendPlayerRevival(player);
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.HP, player.Health.Hp);
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.MP, player.Health.Mp);
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.FP, player.Health.Fp);

            this.ProcessDeathPenality(player);
        }
示例#13
0
 void SpaceShip_TargetReached(SectorObject sender, SystemEventArgs e)
 {
     if (State == "TARGET" || State == "BATTLE")
     {
         SpaceShip ship = this.SpaceShip.Target as SpaceShip;
         if (ship != null)
         {
             //GameManager.Instance.BattleManager.DoBattleCommand(this, ship, "F");
         }
     }
 }
示例#14
0
        public void OnNotification(IEntity entity, SystemEventArgs args)
        {
            switch (args)
            {
            case GameContextCreateRequestEventArgs gccrea:
                var breedId   = entity.Character().BreedId;
                var breedData = GameDataManager <Breed> .Instance.Get(breedId);

                CreateRoleplayContext(entity, breedData.SpawnMap);
                break;
            }
        }
示例#15
0
 public void NotifySystem <T>(IEntity entity, SystemEventArgs e) where T : class, INotifiableSystem
 {
     try
     {
         NotifiableSystems[typeof(T)].Execute(entity, e);
     }
     catch (Exception exception)
     {
         Log.Error("[NOTIFY_SYSTEM]", exception);
         Console.WriteLine(exception);
         throw;
     }
 }
示例#16
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs e)
        {
            if (!(entity is IPlayerEntity player))
            {
                return;
            }

            if (!e.GetCheckArguments())
            {
                Logger.LogError("Cannot execute inventory action: {0} due to invalid arguments.", e.GetType());
                return;
            }

            if (player.Health.IsDead)
            {
                this.Logger.LogWarning($"Cannot execute inventory action {e.GetType()}. Player '{player.Object.Name}' is dead.");
                return;
            }

            switch (e)
            {
            case InventoryInitializeEventArgs inventoryInitializeEvent:
                this.InitializeInventory(player, inventoryInitializeEvent);
                break;

            case InventoryMoveEventArgs inventoryMoveEvent:
                this.ProcessMoveItem(player, inventoryMoveEvent);
                break;

            case InventoryEquipEventArgs inventoryEquipEvent:
                this.ProcessEquipItem(player, inventoryEquipEvent);
                break;

            case InventoryCreateItemEventArgs inventoryCreateItemEvent:
                this.ProcessCreateItem(player, inventoryCreateItemEvent);
                break;

            case InventoryDropItemEventArgs inventoryDropItemEvent:
                this.ProcessDropItem(player, inventoryDropItemEvent);
                break;

            case InventoryUseItemEventArgs inventoryUseItemEvent:
                this.ProcessUseItem(player, inventoryUseItemEvent);
                break;

            default:
                Logger.LogWarning("Unknown inventory action type: {0} for player {1}", e.GetType(), entity.Object.Name);
                break;
            }
        }
示例#17
0
        public override void Execute(IEntity entity, SystemEventArgs e)
        {
            switch (e)
            {
            case VisibilitySetInvisibleEventArgs invisibleEvent:
                SetInvisible(entity, invisibleEvent);
                break;

            case VisibilitySetVisibleEventArgs visibleEvent:
                SetVisible(entity, visibleEvent);
                break;
            }

            throw new NotImplementedException();
        }
示例#18
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs e)
        {
            if (!(entity is IMovableEntity movableEntity) || !e.CheckArguments())
            {
                Logger.Error("FollowSystem: Invalid arguments");
                return;
            }

            switch (e)
            {
            case FollowEventArgs followEvent:
                this.OnFollow(movableEntity, followEvent);
                break;
            }
        }
示例#19
0
        public override async Task <SystemEventDto> TriggerSystemEventAsync(SystemEventArgs args)
        {
            IApiService apiService = new SignalRServerApiService(_bearer);

            var result = await apiService.AddSystemEventAsync(new SystemEventDto
            {
                MachineName = args.MachineName,
                MachineId   = args.MachineId,
                Action      = args.Action,
                Description = args.Description,
                Status      = args.Status,
                CreateAt    = DateTime.UtcNow
            });

            return(result);
        }
示例#20
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs e)
        {
            if (!(entity is IPlayerEntity player) || !(e is NpcDialogOpenEventArgs dialogEvent))
            {
                Logger.Error("DialogSystem: Invalid event arguments.");
                return;
            }

            if (!dialogEvent.CheckArguments())
            {
                Logger.Error("DialogSystem: Invalid event action arguments.");
                return;
            }

            this.OpenDialog(player, dialogEvent);
        }
示例#21
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            switch (entity)
            {
            case IMonsterEntity monster:
                monster.Behavior?.Update(monster);
                break;

            case INpcEntity npc:
                npc.Behavior?.Update(npc);
                break;

            case IPlayerEntity player:
                player.Behavior?.Update(player);
                break;
            }
        }
示例#22
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs e)
        {
            if (!e.GetCheckArguments() || !(entity is IPlayerEntity playerEntity))
            {
                return;
            }

            switch (e)
            {
            case TradeRequestEventArgs tradeRequestEventArgs:
                TradeRequest(playerEntity, tradeRequestEventArgs);
                break;

            case TradeRequestCancelEventArgs tradeRequestCancelEventArgs:
                TradeRequestCancel(playerEntity, tradeRequestCancelEventArgs);
                break;

            case TradeBeginEventArgs tradeBeginEventArgs:
                Trade(playerEntity, tradeBeginEventArgs);
                break;

            case TradePutEventArgs tradePutEventArgs:
                PutItem(playerEntity, tradePutEventArgs);
                break;

            case TradePutGoldEventArgs tradePutGoldEventArgs:
                PutGold(playerEntity, tradePutGoldEventArgs);
                break;

            case TradeCancelEventArgs tradeCancelEventArgs:
                TradeCancel(playerEntity, tradeCancelEventArgs);
                break;

            case TradeConfirmEventArgs tradeConfirmEventArgs:
                TradeConfirm(playerEntity, tradeConfirmEventArgs);
                break;

            case TradeOkEventArgs tradeOkEventArgs:
                TradeOk(playerEntity, tradeOkEventArgs);
                break;

            default:
                Logger.Warn("Unknown trade action type: {0} for player {1}", e.GetType(), entity.Object.Name);
                break;
            }
        }
示例#23
0
        private void SystemMapOnSystemAdded(object sender, SystemEventArgs args)
        {
            var system = args.Source;

            var updateableSystem = system as IUpdateableSystem;

            if (updateableSystem != null)
            {
                updateableSystems.Add(updateableSystem);
            }

            var renderableSystem = system as IRenderableSystem;

            if (renderableSystem != null)
            {
                renderableSystems.Add(renderableSystem);
            }
        }
示例#24
0
        public void OnNotification(IEntity entity, SystemEventArgs args)
        {
            switch (args)
            {
            case SendInfoMessageEventArgs simea:
                var tim = new TextInformationMessage(simea.Type, simea.MessageId, simea.Args.ToArray());
                entity.Send(tim);
                break;

            case ClientChatMessageEventArgs ccmea:
                OnClientChat(entity, ccmea);
                break;

            case ClientEnteringGameEventArgs cegea:
                entity.Notify(new SendInfoMessageEventArgs(InfoMessages.WelcomeMessage));
                break;
            }
        }
示例#25
0
        /// <summary>
        /// Executes the <see cref="MobilitySystem"/> logic.
        /// </summary>
        /// <param name="entity">Current entity</param>
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            if (!entity.Object.Spawned)
            {
                return;
            }

            var movableEntity = entity as IMovableEntity;

            if (movableEntity.Moves.NextMoveTime > Time.GetElapsedTime())
            {
                return;
            }

            movableEntity.Moves.NextMoveTime = Time.GetElapsedTime() + 10;

            if (movableEntity.Moves.DestinationPosition.IsZero())
            {
                return;
            }

            if (movableEntity.Object.MovingFlags.HasFlag(ObjectState.OBJSTA_STAND))
            {
                return;
            }

            if (movableEntity.Follow.IsFollowing)
            {
                if (!movableEntity.Object.Position.IsInCircle(movableEntity.Follow.Target.Object.Position, movableEntity.Follow.FollowDistance))
                {
                    movableEntity.Moves.DestinationPosition = movableEntity.Follow.Target.Object.Position.Clone();
                    movableEntity.Object.MovingFlags       &= ~ObjectState.OBJSTA_STAND;
                    movableEntity.Object.MovingFlags       |= ObjectState.OBJSTA_FMOVE;
                }
                if (movableEntity.Object.Position.IsInCircle(movableEntity.Follow.Target.Object.Position, movableEntity.Follow.FollowDistance) &&
                    !movableEntity.Object.MovingFlags.HasFlag(ObjectState.OBJSTA_STAND))
                {
                    // Arrived
                    movableEntity.Object.MovingFlags = ObjectState.OBJSTA_STAND;
                }
            }

            this.Walk(movableEntity);
        }
示例#26
0
        public override void Execute(IEntity entity, SystemEventArgs e)
        {
            var inventory = entity.GetComponent <InventoryComponent>();

            switch (e)
            {
            case InventoryAddItemEventArgs addItemEventArgs:
                AddItem(inventory, addItemEventArgs);
                break;

            case InventoryDropItemEventArgs dropItemEventArgs:
                DropItem(inventory, dropItemEventArgs);
                break;

            case InventoryDestroyItemEventArgs destroyItemEventArgs:
                DestroyItem(inventory, destroyItemEventArgs);
                break;
            }
        }
示例#27
0
        /// <summary>
        /// Executes the <see cref="VisibilitySystem"/> logic.
        /// </summary>
        /// <param name="entity">Current entity</param>
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            if (!entity.Object.Spawned)
            {
                return;
            }

            var currentMapLayer = entity.Context as IMapLayer;

            if (currentMapLayer == null)
            {
                throw new RhisisSystemException($"Object {entity.Object.Name}:{entity.Id} doesn't belong to a map layer.");
            }

            var currentMap = currentMapLayer.Parent;

            if (currentMap != null)
            {
                UpdateEntitiesVisibility(entity, currentMap.Entities);
            }

            if (currentMapLayer != null)
            {
                UpdateEntitiesVisibility(entity, currentMapLayer.Entities);

                if (entity.Type == WorldEntityType.Player)
                {
                    foreach (var region in currentMapLayer.Regions)
                    {
                        if (!region.IsActive && entity.Object.Position.Intersects(region.GetRectangle(), VisibilityRange))
                        {
                            region.IsActive = true;
                        }

                        if (region.IsActive && region is IMapRespawnRegion respawner)
                        {
                            UpdateEntitiesVisibility(entity, respawner.Entities);
                        }
                    }
                }
            }
        }
示例#28
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            if (!entity.Object.Spawned)
            {
                return;
            }

            if (entity is IPlayerEntity player)
            {
                var triggerRegion = entity.Object.CurrentMap.Regions.FirstOrDefault(x => x is IMapTriggerRegion region &&
                                                                                    region.IsWrapzone &&
                                                                                    region.GetRectangle().Contains(entity.Object.Position))
                                    as IMapTriggerRegion;

                if (triggerRegion != null && triggerRegion.IsWrapzone)
                {
                    player.NotifySystem <TeleportSystem>(new TeleportEventArgs(triggerRegion.DestinationMapId, triggerRegion.DestinationMapPosition));
                }
            }
        }
示例#29
0
        private void SystemMapOnSystemRemoved(object sender, SystemEventArgs args)
        {
            var system = args.Source;

            var updateableSystem = system as IUpdateableSystem;

            if (updateableSystem != null)
            {
                lock (updateableSystems)
                    updateableSystems.Remove(updateableSystem);
            }

            var renderableSystem = system as IRenderableSystem;

            if (renderableSystem != null)
            {
                lock (renderableSystems)
                    renderableSystems.Remove(renderableSystem);
            }
        }
示例#30
0
        public override void Execute(IEntity entity, SystemEventArgs e)
        {
            if (!Match(entity))
            {
                return;
            }

            switch (e)
            {
            case VisibilitySetInvisibleEventArgs invisibleEvent:
                SetInvisible(entity, invisibleEvent);
                break;

            case VisibilitySetVisibleEventArgs visibleEvent:
                SetVisible(entity, visibleEvent);
                break;

            default:
                throw new NotImplementedException();
            }
        }