private void MonsterAttackQueue(int skillId) { List <PacketResponse> brList = new List <PacketResponse>(); RecvBattleReportStartNotify brStart = new RecvBattleReportStartNotify(monster.instanceId); RecvBattleReportEndNotify brEnd = new RecvBattleReportEndNotify(); RecvBattleReportActionAttackExec brAttack = new RecvBattleReportActionAttackExec(skillId); brList.Add(brStart); brList.Add(brAttack); brList.Add(brEnd); server.router.Send(_map, brList); }
public void TriggerTrap(Trap trap, MonsterSpawn monster) { Logger.Debug( $"trap._name [{trap._name}] trap.InstanceId [{trap.InstanceId}] trap._skillEffectId [{trap._skillEffectId}] trap._triggerEffectId [{trap._triggerEffectId}]"); NecClient client = _map.ClientLookup.GetByCharacterInstanceId(ownerInstanceId); if (client.Character.IsStealthed()) { uint newState = client.Character.ClearStateBit(0x8); RecvCharaNotifyStateflag charState = new RecvCharaNotifyStateflag(client.Character.InstanceId, newState); _server.Router.Send(client.Map, charState); } int damage = Util.GetRandomNumber(70, 90); RecvDataNotifyEoData eoTriggerData = new RecvDataNotifyEoData(trap.InstanceId, monster.InstanceId, trap._triggerEffectId, TrapPos, 2, 2); _server.Router.Send(_map, eoTriggerData); float perHp = (((float)monster.Hp.current / (float)monster.Hp.max) * 100); List <PacketResponse> brList = new List <PacketResponse>(); RecvBattleReportStartNotify brStart = new RecvBattleReportStartNotify(ownerInstanceId); RecvBattleReportEndNotify brEnd = new RecvBattleReportEndNotify(); RecvBattleReportActionAttackExec brAttack = new RecvBattleReportActionAttackExec(trap._skillId); RecvBattleReportNotifyHitEffect brHit = new RecvBattleReportNotifyHitEffect(monster.InstanceId); RecvBattleReportPhyDamageHp brPhyHp = new RecvBattleReportPhyDamageHp(monster.InstanceId, damage); RecvObjectHpPerUpdateNotify oHpUpdate = new RecvObjectHpPerUpdateNotify(monster.InstanceId, perHp); RecvBattleReportDamageHp brHp = new RecvBattleReportDamageHp(monster.InstanceId, damage); brList.Add(brStart); //brList.Add(brAttack); brList.Add(brHit); //brList.Add(brPhyHp); brList.Add(brHp); brList.Add(oHpUpdate); brList.Add(brEnd); _server.Router.Send(_map, brList); if (monster.GetAgroCharacter(ownerInstanceId)) { monster.UpdateHP(-damage); } else { monster.UpdateHP(-damage, _server, true, ownerInstanceId); } }
private void DamageTheObject(NecClient client, uint instanceId, int damage, float perHp) { List <PacketResponse> brTargetList = new List <PacketResponse>(); RecvBattleReportStartNotify brStart = new RecvBattleReportStartNotify(instanceId); RecvBattleReportEndNotify brEnd = new RecvBattleReportEndNotify(); RecvBattleReportActionAttackExec brAttack = new RecvBattleReportActionAttackExec( (int)instanceId); //should this be the instance ID of the attacker? we have it marked as skillId RecvBattleReportNotifyHitEffect brHit = new RecvBattleReportNotifyHitEffect(instanceId); RecvBattleReportPhyDamageHp brPhyHp = new RecvBattleReportPhyDamageHp(instanceId, damage); RecvBattleReportDamageHp brHp = new RecvBattleReportDamageHp(instanceId, damage); RecvObjectHpPerUpdateNotify oHpUpdate = new RecvObjectHpPerUpdateNotify(instanceId, perHp); RecvBattleReportNotifyKnockback brKnockBack = new RecvBattleReportNotifyKnockback(instanceId, 001, 001); brTargetList.Add(brStart); brTargetList.Add(brAttack); brTargetList.Add(brHit); //brTargetList.Add(brPhyHp); brTargetList.Add(brHp); brTargetList.Add(oHpUpdate); //brTargetList.Add(brKnockBack); //knockback doesn't look right here. need to make it better. brTargetList.Add(brEnd); router.Send(client.map, brTargetList); }
private void OldBattleLogic(NecClient client, uint instanceId) { int damage = 0; float perHp = 100.0f; int seed = Util.GetRandomNumber(0, 20); if (seed < 2) { damage = Util.GetRandomNumber(1, 4); // Light hit } else if (seed < 19) { damage = Util.GetRandomNumber(16, 24); // Normal hit } else { damage = Util.GetRandomNumber(32, 48); // Critical hit } //stops the logic gate below if nothing is targeted. This was because Rev 1 of battle logic only worked on targeted objects. probably will go away with progress on 'area of affect' based melee if (instanceId == 0) { return; } IInstance instance = Server.Instances.GetInstance(instanceId); switch (instance) { case NpcSpawn npcSpawn: client.Map.NpcSpawns.TryGetValue(npcSpawn.InstanceId, out npcSpawn); { double distanceToNPC = distance(npcSpawn.X, npcSpawn.Y, client.Character.X, client.Character.Y); Logger.Debug( $"NPC name [{npcSpawn.Name}] distanceToNPC [{distanceToNPC}] Radius [{npcSpawn.Radius}] {npcSpawn.Name}"); if (distanceToNPC > npcSpawn.Radius + 125) { //SendBattleReportEndNotify(client, instance); return; } if (client.Character.criminalState < 1) { client.Character.criminalState = 1; IBuffer res40 = BufferProvider.Provide(); res40.WriteUInt32(client.Character.InstanceId); res40.WriteByte(client.Character.criminalState); Logger.Debug( $"Setting crime level for Character {client.Character.Name} to {client.Character.criminalState}"); Router.Send(client, (ushort)AreaPacketId.recv_chara_update_notify_crime_lv, res40, ServerType.Area); Router.Send(client.Map, (ushort)AreaPacketId.recv_charabody_notify_crime_lv, res40, ServerType.Area, client); } } break; case MonsterSpawn monsterSpawn: client.Map.MonsterSpawns.TryGetValue(monsterSpawn.InstanceId, out monsterSpawn); { double distanceToMonster = distance(monsterSpawn.X, monsterSpawn.Y, client.Character.X, client.Character.Y); Logger.Debug( $"monster name [{monsterSpawn.Name}] distanceToMonster [{distanceToMonster}] Radius [{monsterSpawn.Radius}] {monsterSpawn.Name}"); if (distanceToMonster > monsterSpawn.Radius + 125) { //SendBattleReportEndNotify(client, instance); return; } if (monsterSpawn.GetAgroCharacter(client.Character.InstanceId)) { monsterSpawn.UpdateHP(-damage); } else { monsterSpawn.UpdateHP(-damage, _server, true, client.Character.InstanceId); } if (client.Character.IsStealthed()) { uint newState = client.Character.ClearStateBit(0x8); RecvCharaNotifyStateflag charState = new RecvCharaNotifyStateflag(client.Character.InstanceId, newState); _server.Router.Send(client.Map, charState); } perHp = (float)monsterSpawn.Hp.current / monsterSpawn.Hp.max * 100; Logger.Debug($"CurrentHp [{monsterSpawn.Hp.current}] MaxHp[{monsterSpawn.Hp.max}] perHp[{perHp}]"); } break; case Character character: NecClient targetClient = client.Map.ClientLookup.GetByCharacterInstanceId(instance.InstanceId); double distanceToCharacter = distance(targetClient.Character.X, targetClient.Character.Y, client.Character.X, client.Character.Y); Logger.Debug( $"target Character name [{targetClient.Character.Name}] distanceToCharacter [{distanceToCharacter}] Radius { /*[{monsterSpawn.Radius}]*/" 125 "} {targetClient.Character.Name}"); if (distanceToCharacter > /*targetClient.Character.Radius +*/ 125) { //SendBattleReportEndNotify(client, instance); return; } targetClient.Character.Hp.Modify(-damage, character.InstanceId); perHp = (float)targetClient.Character.Hp.current / targetClient.Character.Hp.max * 100; Logger.Debug( $"CurrentHp [{targetClient.Character.Hp.current}] MaxHp[{targetClient.Character.Hp.max}] perHp[{perHp}]"); RecvCharaUpdateHp cHpUpdate = new RecvCharaUpdateHp(targetClient.Character.Hp.current); _server.Router.Send(targetClient, cHpUpdate.ToPacket()); //logic to turn characters to criminals on criminal actions. possibly should move to character task. client.Character.criminalState += 1; if (client.Character.criminalState == 1 | client.Character.criminalState == 2 | client.Character.criminalState == 3) { IBuffer res40 = BufferProvider.Provide(); res40.WriteUInt32(client.Character.InstanceId); res40.WriteByte(client.Character.criminalState); Logger.Debug( $"Setting crime level for Character {client.Character.Name} to {client.Character.criminalState}"); Router.Send(client, (ushort)AreaPacketId.recv_chara_update_notify_crime_lv, res40, ServerType.Area); Router.Send(client.Map, (ushort)AreaPacketId.recv_charabody_notify_crime_lv, res40, ServerType.Area, client); } if (client.Character.criminalState > 255) { client.Character.criminalState = 255; } break; default: Logger.Error($"Instance with InstanceId: {instance.InstanceId} does not exist"); break; } List <PacketResponse> brTargetList = new List <PacketResponse>(); RecvBattleReportStartNotify brStart = new RecvBattleReportStartNotify(client.Character.InstanceId); RecvBattleReportEndNotify brEnd = new RecvBattleReportEndNotify(); RecvBattleReportActionAttackExec brAttack = new RecvBattleReportActionAttackExec((int)instance.InstanceId); RecvBattleReportNotifyHitEffect brHit = new RecvBattleReportNotifyHitEffect(instance.InstanceId); RecvBattleReportPhyDamageHp brPhyHp = new RecvBattleReportPhyDamageHp(instance.InstanceId, damage); RecvBattleReportDamageHp brHp = new RecvBattleReportDamageHp(instance.InstanceId, damage); RecvObjectHpPerUpdateNotify oHpUpdate = new RecvObjectHpPerUpdateNotify(instance.InstanceId, perHp); brTargetList.Add(brStart); brTargetList.Add(brAttack); brTargetList.Add(brHit); brTargetList.Add(brPhyHp); //brTargetList.Add(brHp); brTargetList.Add(oHpUpdate); brTargetList.Add(brEnd); Router.Send(client.Map, brTargetList); }