Beispiel #1
0
        private void Stealth(NecClient client, int skillId)
        {
            // I am doing this from memory, it could very well be wrong  :)
            // Not blocking any actions if stealthed.
            // Stealth will be turned off if start casting another skill or damage is done.

            int     errorCode = 0;
            Stealth stealth   = new Stealth(_server, client, skillId);

            server.instances.AssignInstance(stealth);
            client.character.activeSkillInstance = stealth.instanceId;
            if (!_server.settingRepository.skillBase.TryGetValue(skillId, out SkillBaseSetting skillBaseSetting))
            {
                _Logger.Error($"Getting SkillBaseSetting from skillid [{skillId}]");
                errorCode = -1;
                RecvSkillStartCastR startFail = new RecvSkillStartCastR(errorCode, 0.0F);
                router.Send(startFail, client);
                return;
            }

            RecvSkillStartCastR skillFail = new RecvSkillStartCastR(errorCode, skillBaseSetting.castingTime);

            router.Send(skillFail, client);
            stealth.StartCast();
        }
        public void StartCast()
        {
            if (_targetInstanceId == 0)
            {
                _targetInstanceId = _client.character.instanceId;
            }
            IInstance target = _server.instances.GetInstance(_targetInstanceId);

            switch (target) // ToDO     Do a hositilty check to make sure this is allowed
            {
            case NpcSpawn npcSpawn:
                _Logger.Debug($"Start casting Skill [{_skillId}] on NPCId: {npcSpawn.instanceId}");
                break;

            case MonsterSpawn monsterSpawn:
                _Logger.Debug($"Start casting Skill [{_skillId}] on MonsterId: {monsterSpawn.instanceId}");
                break;

            case Character character:
                _Logger.Debug($"Start casting Skill [{_skillId}] on CharacterId: {character.instanceId}");
                break;

            default:
                _Logger.Error(
                    $"Instance with InstanceId: {target.instanceId} does not exist.  the ground is gettin blasted");
                break;
            }

            if (!_server.settingRepository.skillBase.TryGetValue(_skillId, out SkillBaseSetting skillBaseSetting))
            {
                _Logger.Error($"Could not get SkillBaseSetting for skillId : {_skillId}");
                return;
            }

            float castTime = skillBaseSetting.castingTime;

            _Logger.Debug($"Start casting Skill [{_skillId}] cast time is [{castTime}]");
            RecvSkillStartCastR spell = new RecvSkillStartCastR(0, castTime);

            _server.router.Send(spell, _client);
            List <PacketResponse>                brList      = new List <PacketResponse>();
            RecvBattleReportStartNotify          brStart     = new RecvBattleReportStartNotify(_client.character.instanceId);
            RecvBattleReportEndNotify            brEnd       = new RecvBattleReportEndNotify();
            RecvBattleReportActionSkillStartCast brStartCast = new RecvBattleReportActionSkillStartCast(_skillId);

            brList.Add(brStart);
            brList.Add(brStartCast);
            brList.Add(brEnd);
            _server.router.Send(_client.map, brList);
        }
Beispiel #3
0
        private void ThiefSkill(NecClient client, int skillId, uint skillTarget)
        {
            int skillBase = skillId / 1000;

            if (client.character.IsStealthed() && skillBase != 114607)
            {
                client.character.ClearStateBit(CharacterState.StealthForm);
                RecvCharaNotifyStateflag charState =
                    new RecvCharaNotifyStateflag(client.character.instanceId, (uint)client.character.state);
                _server.router.Send(client.map, charState);
            }

            if (skillBase > 114300 && skillBase < 114399)
            {
                Trap(client, skillId);
                return;
            }

            if (skillBase == 114607)
            {
                Stealth(client, skillId);
                return;
            }

            if (skillTarget == 0)
            {
                _Logger.Debug($"Skill requires target!! [{skillId}]");
                int errorCode = -1311;
                RecvSkillStartCastR skillFail = new RecvSkillStartCastR(errorCode, 0);
                router.Send(skillFail, client);
                return;
            }

            ThiefSkill thiefSkill = new ThiefSkill(_server, client, skillId, skillTarget);

            server.instances.AssignInstance(thiefSkill);
            client.character.activeSkillInstance = thiefSkill.instanceId;
            thiefSkill.StartCast();
        }
Beispiel #4
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);
        }