private void Trap(NecClient client, int skillId, SkillBaseSetting skillBaseSetting)
        {
            Logger.Debug($"skillId : {skillId}");
            if (!int.TryParse($"{skillId}".Substring(1, 5), out int skillBase))
            {
                Logger.Error($"Creating skillBase from skillid [{skillId}]");
                int            errorCode = -1;
                RecvSkillExecR execFail  = new RecvSkillExecR(errorCode, 0, 0);
                Router.Send(execFail, client);
                return;
            }

            if (!int.TryParse($"{skillId}".Substring(1, 7), out int effectBase))
            {
                Logger.Error($"Creating skillBase from skillid [{skillId}]");
                int            errorCode = -1;
                RecvSkillExecR execFail  = new RecvSkillExecR(errorCode, 0, 0);
                Router.Send(execFail, client);
                return;
            }

            bool isBaseTrap = TrapTask.baseTrap(skillBase);

            effectBase += 1;
            if (!_server.SettingRepository.EoBase.TryGetValue(effectBase, out EoBaseSetting eoBaseSetting))
            {
                Logger.Error($"Getting EoBaseSetting from effectBase [{effectBase}]");
                int            errorCode = -1;
                RecvSkillExecR execFail  = new RecvSkillExecR(errorCode, 0, 0);
                Router.Send(execFail, client);
                return;
            }

            if (!_server.SettingRepository.EoBase.TryGetValue(effectBase + 1, out EoBaseSetting eoBaseSettingTriggered))
            {
                Logger.Error($"Getting EoBaseSetting from effectBase+1 [{effectBase + 1}]");
                int            errorCode = -1;
                RecvSkillExecR execFail  = new RecvSkillExecR(errorCode, 0, 0);
                Router.Send(execFail, client);
                return;
            }

            RecvSkillExecR execSuccess =
                new RecvSkillExecR(0, skillBaseSetting.CastingCooldown, skillBaseSetting.RigidityTime);

            Router.Send(execSuccess, client);

            // ToDo  verify trap parts available and remove correct number from inventory
            TrapStack trapStack = (TrapStack)Server.Instances.GetInstance((uint)client.Character.activeSkillInstance);
            Trap      trap      = new Trap(skillBase, skillBaseSetting, eoBaseSetting, eoBaseSettingTriggered);

            _server.Instances.AssignInstance(trap);
            Logger.Debug($"trap.InstanceId [{trap.InstanceId}]  trap.Name [{trap._name}]  skillId[{skillId}]");
            trapStack.SkillExec(trap, isBaseTrap);
            Vector3 trapPos = new Vector3(client.Character.X, client.Character.Y, client.Character.Z);
        }
示例#2
0
        public void SkillExec(Trap trap, bool isBaseTrap)
        {
            Vector3 trgCoord = new Vector3(_client.Character.X, _client.Character.Y, _client.Character.Z);

            if (!int.TryParse($"{trap._skillId}".Substring(1, 6) + 1, out int effectId))
            {
                Logger.Error($"Creating effectId from skillid [{trap._skillId}]");
            }

            List <PacketResponse>           brList  = new List <PacketResponse>();
            RecvBattleReportStartNotify     brStart = new RecvBattleReportStartNotify(_client.Character.InstanceId);
            RecvBattleReportEndNotify       brEnd   = new RecvBattleReportEndNotify();
            RecvBattleReportActionSkillExec brExec  = new RecvBattleReportActionSkillExec(trap._skillId);

            brList.Add(brStart);
            brList.Add(brExec);
            brList.Add(brEnd);
            _server.Router.Send(_client.Map, brList);
            Logger.Debug($"SpearTrap effectId [{effectId}]");
            RecvDataNotifyEoData eoData = new RecvDataNotifyEoData(trap.InstanceId, _client.Character.InstanceId,
                                                                   effectId, trgCoord, 2, 2);

            _server.Router.Send(_map, eoData);

            if (isBaseTrap)
            {
                _trapTask = new TrapTask(_server, _map, _trapPos, _ownerInstanceId, trap, this.InstanceId);
                _trapTask.AddTrap(trap);
                _map.AddTrap(this.InstanceId, this);
                _trapTask.Start();
            }
            else
            {
                _trapTask.AddTrap(trap);
            }
        }
示例#3
0
        private void Trap(NecClient client, int skillId)
        {
            if (!int.TryParse($"{skillId}".Substring(1, 5), out int skillBase))
            {
                _Logger.Error($"Creating skillBase from skillid [{skillId}]");
                int errorCode = -1;
                RecvSkillStartCastR skillFail = new RecvSkillStartCastR(errorCode, 0);
                router.Send(skillFail, client);
                return;
            }

            if (!int.TryParse($"{skillId}".Substring(1, 7), out int effectBase))
            {
                _Logger.Error($"Creating skillBase from skillid [{skillId}]");
                int errorCode = -1;
                RecvSkillStartCastR skillFail = new RecvSkillStartCastR(errorCode, 0);
                router.Send(skillFail, client);
                return;
            }

            effectBase += 1;
            _Logger.Debug($"skillId [{skillId}] skillBase [{skillBase}] effectBase [{effectBase}]");
            if (!_server.settingRepository.skillBase.TryGetValue(skillId, out SkillBaseSetting skillBaseSetting))
            {
                _Logger.Error($"Getting SkillBaseSetting for skillid [{skillId}]");
                return;
            }

            if (!_server.settingRepository.eoBase.TryGetValue(effectBase, out EoBaseSetting eoBaseSetting))
            {
                _Logger.Error($"Getting EoBaseSetting from effectBase [{effectBase}]");
                return;
            }

            Vector3   charPos    = new Vector3(client.character.x, client.character.y, client.character.z);
            bool      isBaseTrap = TrapTask.BaseTrap(skillBase);
            TrapStack trapStack  = null;

            if (isBaseTrap)
            {
                int trapRadius = eoBaseSetting.effectRadius;
                trapStack = new TrapStack(_server, client, charPos, trapRadius);
                server.instances.AssignInstance(trapStack);
            }
            else
            {
                trapStack = client.map.GetTrapCharacterRange(client.character.instanceId, 75, charPos);
            }

            if (isBaseTrap)
            {
                _Logger.Debug(
                    $"Is base trap skillId [{skillId}] skillBase [{skillBase}] trapStack._trapRadius [{trapStack.trapRadius}]");
                if (client.map.GetTrapsCharacterRange(client.character.instanceId, trapStack.trapRadius, charPos))
                {
                    _Logger.Debug($"First trap with another trap too close [{skillId}]");
                    int errorCode = -1309;
                    RecvSkillStartCastR skillFail = new RecvSkillStartCastR(errorCode, 0);
                    router.Send(skillFail, client);
                    return;
                }
            }
            else
            {
                _Logger.Debug(
                    $"Is trap enhancement skillId [{skillId}] skillBase [{skillBase}] trapRadius [{trapStack.trapRadius}]");
                if (!client.map.GetTrapsCharacterRange(client.character.instanceId, trapStack.trapRadius, charPos))
                {
                    _Logger.Debug($"Trap enhancement without a base trap [{skillId}]");
                    int errorCode = -1;
                    RecvSkillStartCastR skillFail = new RecvSkillStartCastR(errorCode, 0);
                    router.Send(skillFail, client);
                    return;
                }
            }

            _Logger.Debug($"Valid position check for monsters skillId [{skillId}] skillBase [{skillBase}]");
            if (client.map.MonsterInRange(charPos, trapStack.trapRadius))
            {
                _Logger.Debug($"Monster too close [{skillId}]");
                int errorCode = -1310;
                RecvSkillStartCastR skillFail = new RecvSkillStartCastR(errorCode, 0);
                router.Send(skillFail, client);
                return;
            }

            _Logger.Debug(
                $"skillBaseSetting.Id [{skillBaseSetting.id}] skillBaseSetting.Name [{skillBaseSetting.name} eoBaseSetting.]");
            _Logger.Debug($"spearTrap.InstanceId [{trapStack.instanceId}] SpearTrap skillID [{skillId}]");
            client.character.activeSkillInstance = trapStack.instanceId;
            client.character.castingSkill        = true;
            trapStack.StartCast(skillBaseSetting);
        }