public bool Read(int bufferId, int start, int length) { var buffer = NetMessage.buffer[bufferId]; int npcId = (int)buffer.reader.ReadInt16(); int playerId = (int)buffer.reader.ReadByte(); if (Main.netMode == 2) playerId = bufferId; var ply = Main.player[playerId]; var ctx = new HookContext() { Sender = ply, Player = ply }; var args = new TDSMHookArgs.NpcHurtReceived() { Victim = Terraria.Main.npc[npcId], Damage = ply.inventory[ply.selectedItem].damage, HitDirection = ply.direction, Knockback = ply.inventory[ply.selectedItem].knockBack, Critical = false, FromNet = false, NoEffect = false }; TDSMHookPoints.NpcHurtReceived.Invoke(ref ctx, ref args); if (ctx.CheckForKick() || ctx.Result == HookResult.IGNORE) return true; Terraria.Main.npc[npcId].StrikeNPC(args.Damage, args.Knockback, args.HitDirection, false, false, false); if (Main.netMode == 2) { NetMessage.SendData(24, -1, bufferId, "", npcId, (float)playerId, 0, 0, 0, 0, 0); NetMessage.SendData(23, -1, -1, "", npcId, 0, 0, 0, 0, 0, 0); } return true; }
public bool Read(int bufferId, int start, int length) { var buffer = NetMessage.buffer[bufferId]; var npcId = (int)buffer.reader.ReadInt16(); var damage = (int)buffer.reader.ReadInt16(); var knockBack = buffer.reader.ReadSingle(); var hitDirection = (int)(buffer.reader.ReadByte() - 1); var critical = buffer.reader.ReadByte(); if (Main.netMode == 2) { if (damage < 0) damage = 0; Main.npc[npcId].PlayerInteraction(buffer.whoAmI); } var ply = Main.player[bufferId]; var ctx = new HookContext() { Sender = ply, Player = ply }; var args = new TDSMHookArgs.NpcHurtReceived() { Victim = Terraria.Main.npc[npcId], Damage = ply.inventory[ply.selectedItem].damage, HitDirection = ply.direction, Knockback = ply.inventory[ply.selectedItem].knockBack, Critical = false }; TDSMHookPoints.NpcHurtReceived.Invoke(ref ctx, ref args); if (ctx.CheckForKick() || ctx.Result == HookResult.IGNORE) return true; if (damage >= 0) Main.npc[npcId].StrikeNPC(damage, knockBack, hitDirection, critical == 1, false, true); else { Main.npc[npcId].life = 0; Main.npc[npcId].HitEffect(0, 10.0); Main.npc[npcId].active = false; } if (Main.netMode != 2) return true; NetMessage.SendData(28, -1, buffer.whoAmI, String.Empty, npcId, (float)damage, knockBack, (float)hitDirection, (int)critical); if (Main.npc[npcId].life <= 0) NetMessage.SendData(23, -1, -1, String.Empty, npcId); else Main.npc[npcId].netUpdate = true; if (Main.npc[npcId].realLife < 0) return true; if (Main.npc[Main.npc[npcId].realLife].life <= 0) { NetMessage.SendData(23, -1, -1, String.Empty, Main.npc[npcId].realLife); return true; } Main.npc[Main.npc[npcId].realLife].netUpdate = true; return true; }