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); }
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(); }
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); }