public static void OnUnkownPacketSend(ref HookContext ctx, ref HookArgs.UnkownSendPacket args) { switch (args.PacketId) { case (int)Packets.CLIENT_MOD_GOD: { NetMessageExtension msg = new NetMessageExtension(); if (args.RemoteClient != -1) { var player = Main.players[args.RemoteClient]; if (player.HasClientMod) { if (Server.AllowTDCMRPG) { Server.notifyOps( String.Format("Failed attempt to {0} God Mode on an RPG Server.", true, (args.Number == 1) ? "give" : "remove")); return; } Server.notifyOps( String.Format("{0} {1} God Mode.", true, player.Name, (args.Number == 1) ? "has" : "doesn't have")); msg.GodTDCMClient(args.Number == 1); args.Message = msg; ctx.SetResult(HookResult.IGNORE); //Let TDSM know it's to ignore returning. } } break; } } }
public override void Process(ClientConnection conn, byte[] readBuffer, int length, int num) { var data = Encoding.ASCII.GetString (readBuffer, num, length - 1); var lines = data.Split ('\n'); foreach (var line in lines) { if (line == "tdcm1") { //player.HasClientMod = true; ProgramLog.Log ("{0} is a TDCM protocol version 1 client.", conn.RemoteAddress); } else if (line == "tdsmcomp1") { conn.CompressionVersion = 1; ProgramLog.Log ("{0} supports TDSM compression version 1.", conn.RemoteAddress); } } var ctx = new HookContext { Connection = conn, }; var args = new HookArgs.DisconnectReceived { Content = data, Lines = lines, }; HookPoints.DisconnectReceived.Invoke (ref ctx, ref args); ctx.CheckForKick (); }
public ClientConnection(Socket socket, int slot) : base(socket) { //var buf = NetMessage.buffer[id]; //socket.SendBufferSize = 128000; connectedAt = time.Elapsed; if (slot >= 0) { AssignSlot(slot); } socket.LingerState = new LingerOption(true, 10); var ctx = new Terraria_Server.Plugins.HookContext { Connection = this, }; var args = new Terraria_Server.Plugins.HookArgs.NewConnection(); Terraria_Server.Plugins.HookPoints.NewConnection.Invoke(ref ctx, ref args); if (ctx.CheckForKick()) { return; } lock (All) { indexInAll = All.Count; All.Add(this); } StartReceiving(new byte [4192]); }
public ClientConnection(Socket socket, int slot) : base(socket) { //var buf = NetMessage.buffer[id]; //socket.SendBufferSize = 128000; connectedAt = time.Elapsed; if (slot >= 0) AssignSlot (slot); socket.LingerState = new LingerOption (true, 10); var ctx = new Terraria_Server.Plugins.HookContext { Connection = this, }; var args = new Terraria_Server.Plugins.HookArgs.NewConnection (); Terraria_Server.Plugins.HookPoints.NewConnection.Invoke (ref ctx, ref args); if (ctx.CheckForKick ()) return; lock (All) { indexInAll = All.Count; All.Add (this); } StartReceiving (new byte [4192]); }
public override void Process(int whoAmI, byte[] readBuffer, int length, int num) { int playerId = readBuffer[num++]; //TODO: maybe check for forgery byte action = readBuffer[num]; if (action == 1) { var player = Main.players[whoAmI]; var ctx = new HookContext { Connection = player.Connection, Sender = player, Player = player, }; var args = new HookArgs.PlayerTriggeredEvent { Type = WorldEventType.BOSS, Name = "Skeletron", }; HookPoints.PlayerTriggeredEvent.Invoke (ref ctx, ref args); if (ctx.CheckForKick () || ctx.Result == HookResult.IGNORE) return; ProgramLog.Users.Log ("{0} @ {1}: Skeletron summoned by {2}.", player.IPAddress, whoAmI, player.Name); NetMessage.SendData (Packet.PLAYER_CHAT, -1, -1, string.Concat (player.Name, " has summoned Skeletron!"), 255, 255, 128, 150); NPC.SpawnSkeletron(); } else if (action == 2) { NetMessage.SendData (51, -1, whoAmI, "", playerId, action, 0f, 0f, 0); } }
public override void Process(ClientConnection conn, byte[] readBuffer, int length, int num) { if (conn.State == SlotState.ACCEPTED) { SlotManager.Schedule (conn, conn.DesiredQueue); return; } int whoAmI = conn.SlotIndex; if (NetPlay.slots[whoAmI].state == SlotState.ASSIGNING_SLOT) { NetPlay.slots[whoAmI].state = SlotState.SENDING_WORLD; } var ctx = new HookContext() { Connection = conn, Player = conn.Player }; var args = new HookArgs.WorldRequestMessage() { SpawnX = Main.spawnTileX, SpawnY = Main.spawnTileY }; HookPoints.WorldRequestMessage.Invoke(ref ctx, ref args); //NetMessage.SendData(7, whoAmI); var msg = NetMessage.PrepareThreadInstance(); msg.WorldData(args.SpawnX, args.SpawnY); msg.Send(whoAmI); }
public override void Process(int whoAmI, byte[] readBuffer, int length, int num) { short identity = BitConverter.ToInt16(readBuffer, num); num += 2; byte owner = readBuffer[num]; owner = (byte)whoAmI; int index = Projectile.FindExisting(identity, owner); if (index == 1000) return; var player = Main.players[whoAmI]; var ctx = new HookContext { Connection = player.Connection, Player = player, Sender = player, }; var args = new HookArgs.KillProjectileReceived { Id = identity, Owner = owner, Index = (short)index, }; HookPoints.KillProjectileReceived.Invoke(ref ctx, ref args); if (ctx.CheckForKick()) { return; } if (ctx.Result == HookResult.IGNORE) { return; } if (ctx.Result == HookResult.RECTIFY) { var msg = NetMessage.PrepareThreadInstance(); msg.Projectile(Main.projectile[index]); msg.Send(whoAmI); return; } var projectile = Main.projectile[index]; if (projectile.Owner == owner && projectile.identity == identity) { projectile.Kill(null, null); projectile.Reset(); NetMessage.SendData(29, -1, whoAmI, "", (int)identity, (float)owner); } }
public override void Process(int whoAmI, byte[] readBuffer, int length, int num) { int x = BitConverter.ToInt32(readBuffer, num); num += 4; int y = BitConverter.ToInt32(readBuffer, num); num += 4; var player = Main.players[whoAmI]; if (Math.Abs(player.Position.X / 16 - x) >= 7 || Math.Abs(player.Position.Y / 16 - y) >= 7) { return; } int chestIndex = Chest.FindChest(x, y); var ctx = new HookContext { Connection = player.Connection, Player = player, Sender = player, }; var args = new HookArgs.ChestOpenReceived { X = x, Y = y, ChestIndex = (short)chestIndex, }; HookPoints.ChestOpenReceived.Invoke(ref ctx, ref args); if (ctx.CheckForKick()) { return; } if (ctx.Result == HookResult.IGNORE) { return; } if (ctx.Result == HookResult.DEFAULT && chestIndex > -1) { var user = Chest.UsingChest(chestIndex); if (user >= 0 && user != whoAmI) return; for (int i = 0; i < Chest.MAX_ITEMS; i++) { NetMessage.SendData(32, whoAmI, -1, "", chestIndex, (float)i); } NetMessage.SendData(33, whoAmI, -1, "", chestIndex); Main.players[whoAmI].chest = chestIndex; return; } }
public override void Process(int whoAmI, byte[] readBuffer, int length, int num) { int playerIndex = readBuffer[num]; if (playerIndex != whoAmI) { NetPlay.slots[whoAmI].Kick ("Cheating detected (PLAYER_PVP_CHANGE forgery)."); return; } var pvp = readBuffer[num + 1] == 1; var player = Main.players[whoAmI]; var ctx = new HookContext { Connection = player.Connection, Player = player, Sender = player, }; var args = new HookArgs.PvpSettingReceived { PvpFlag = pvp, }; HookPoints.PvpSettingReceived.Invoke (ref ctx, ref args); if (ctx.CheckForKick ()) { return; } if (ctx.Result == HookResult.IGNORE) { return; } if (ctx.Result == HookResult.RECTIFY) { NetMessage.SendData(30, whoAmI, -1, "", whoAmI); return; } player.hostile = pvp; string message = (player.hostile) ? " has enabled PvP!" : " has disabled PvP!"; NetMessage.SendData(30, -1, whoAmI, "", whoAmI); NetMessage.SendData(25, -1, -1, player.Name + message, 255, (float)Main.teamColor[player.team].R, (float)Main.teamColor[player.team].G, (float)Main.teamColor[player.team].B); }
void OnServerStateChange(ref HookContext ctx, ref HookArgs.ServerStateChange args) { if (args.ServerChangeState == ServerState.LOADED) { ProgramLog.Plugin.Log("Starting fishy mod..."); fishy = new Fishy(); ProgramLog.Plugin.Log("Fishy mod Started."); } else if (args.ServerChangeState == ServerState.STOPPING || args.ServerChangeState == ServerState.RESTARTING) { ProgramLog.Plugin.Log("Stopping fishy mod..."); fishy.Stop(); ProgramLog.Plugin.Log("Fishy mod Stopped."); } }
public override void Process(int whoAmI, byte[] readBuffer, int length, int num) { int start = num - 1; int playerIndex = readBuffer[num++]; if (playerIndex != whoAmI) { NetPlay.slots[whoAmI].Kick ("Cheating detected (KILL_PLAYER forgery)."); return; } var player = Main.players[whoAmI]; var ctx = new HookContext { Connection = NetPlay.slots[whoAmI].conn, Sender = player, Player = player, }; var args = new HookArgs.ObituaryReceived { Direction = (int)readBuffer[num++] - 1, Damage = BitConverter.ToInt16 (readBuffer, num++), PvpFlag = readBuffer[++num] }; string obituary; if (!ParseString(readBuffer, num + 1, length - num - 1 + start, out obituary)) { NetPlay.slots[whoAmI].Kick("Invalid characters in obituary message."); return; } args.Obituary = obituary; HookPoints.ObituaryReceived.Invoke (ref ctx, ref args); if (ctx.CheckForKick ()) return; if (ctx.Result == HookResult.IGNORE) return; ProgramLog.Death.Log ("{0} @ {1}: [Death] {2}{3}", player.IPAddress, whoAmI, player.Name ?? "<null>", args.Obituary); player.KillMe (args.Damage, args.Direction, args.PvpFlag == 1, args.Obituary); NetMessage.SendData(44, -1, whoAmI, args.Obituary, whoAmI, args.Direction, args.Damage, args.PvpFlag); }
public override void Process(int whoAmI, byte[] readBuffer, int length, int num) { int x = BitConverter.ToInt32(readBuffer, num); num += 4; int y = BitConverter.ToInt32(readBuffer, num); if (Main.tile.At(x, y).Type != 21) return; var player = Main.players[whoAmI]; var ctx = new HookContext { Connection = player.Connection, Player = player, Sender = player, }; var args = new HookArgs.ChestBreakReceived { X = x, Y = y, }; HookPoints.ChestBreakReceived.Invoke (ref ctx, ref args); if (ctx.CheckForKick ()) { return; } if (ctx.Result == HookResult.IGNORE) { return; } if (ctx.Result == HookResult.RECTIFY) { NetMessage.SendTileSquare(whoAmI, x, y, 3); return; } WorldModify.KillTile(x, y, false, false, false, player); if (!Main.tile.At(x, y).Active || Main.tile.At(x, y).Type != 21) { NetMessage.SendData(17, -1, -1, "", 0, (float)x, (float)y); } }
//TODO: redesign signs public override void Process(int whoAmI, byte[] readBuffer, int length, int num) { int start = num - 1; short signIndex = BitConverter.ToInt16(readBuffer, num); num += 2; int x = BitConverter.ToInt32(readBuffer, num); num += 4; int y = BitConverter.ToInt32(readBuffer, num); num += 4; short existing = (short)Sign.ReadSign (x, y); if (existing >= 0) signIndex = existing; string SignText; if (!ParseString(readBuffer, num, length - num + start, out SignText)) return; // invalid characters var player = Main.players[whoAmI]; var ctx = new HookContext { Connection = player.Connection, Sender = player, Player = player, }; var args = new HookArgs.SignTextSet { X = x, Y = y, SignIndex = signIndex, Text = SignText, OldSign = Main.sign[signIndex], }; HookPoints.SignTextSet.Invoke (ref ctx, ref args); if (ctx.CheckForKick () || ctx.Result == HookResult.IGNORE) return; if (Main.sign[signIndex] == null) Main.sign[signIndex] = new Sign (); Main.sign[signIndex].x = args.X; Main.sign[signIndex].y = args.Y; Sign.TextSign (signIndex, args.Text); }
public static void LoadPlugins() { ProgramLog.Log(Languages.Startup_LoadingPlugins); Terraria_Server.Plugins.PluginManager.Initialize(Statics.PluginPath, Statics.LibrariesPath); var ctx = new HookContext() { Sender = ConsoleSender = new ConsoleSender() }; var eArgs = new HookArgs.ServerStateChange() { ServerChangeState = ServerState.INITIALIZING }; HookPoints.ServerStateChange.Invoke(ref ctx, ref eArgs); PluginManager.LoadPlugins(); ProgramLog.Log(Languages.Startup_PluginsLoaded + ' ' + PluginManager.PluginCount); }
public override void Process(int whoAmI, byte[] readBuffer, int length, int num) { int x = BitConverter.ToInt32(readBuffer, num); num += 4; int y = BitConverter.ToInt32(readBuffer, num); num += 4; int signIndex = Sign.ReadSign(x, y); var player = Main.players[whoAmI]; var ctx = new HookContext { Connection = player.Connection, Sender = player, Player = player, }; var args = new HookArgs.SignTextGet { X = x, Y = y, SignIndex = (short)signIndex, Text = (signIndex >= 0 && Main.sign[signIndex] != null) ? Main.sign[signIndex].text : null, }; HookPoints.SignTextGet.Invoke (ref ctx, ref args); if (ctx.CheckForKick () || ctx.Result == HookResult.IGNORE) return; if (args.Text != null) { var msg = NetMessage.PrepareThreadInstance (); msg.WriteSign (signIndex, x, y, args.Text); msg.Send (whoAmI); } }
public override void Process(int whoAmI, byte[] readBuffer, int length, int num) { if (readBuffer[num++] != whoAmI) { NetPlay.slots[whoAmI].Kick ("Cheating detected (PLAYER_STATE_UPDATE forgery)."); return; } var player = Main.players[whoAmI]; var ctx = new HookContext { Connection = player.Connection, Sender = player, Player = player, }; var args = new HookArgs.StateUpdateReceived (); args.Parse (readBuffer, num); HookPoints.StateUpdateReceived.Invoke (ref ctx, ref args); if (ctx.CheckForKick ()) return; player.oldVelocity = player.Velocity; args.ApplyParams (player); args.ApplyKeys (player); player.fallStart = (int)(player.Position.Y / 16f); if (NetPlay.slots[whoAmI].state == SlotState.PLAYING) { NetMessage.SendData(13, -1, whoAmI, "", whoAmI); } }
/// <summary> /// Hurts player /// </summary> /// <param name="aggressor">Sender who hurt the Player</param> /// <param name="Damage">Damage to do</param> /// <param name="hitDirection">Direction of attack</param> /// <param name="pvp">Whether attack is PvP</param> /// <param name="quiet">Whether to announce</param> /// <param name="deathText">Text to display upon death</param> /// <param name="crit">Whether the hit is critical</param> /// <returns>Damage done</returns> public double Hurt(ISender aggressor, int Damage, int hitDirection, bool pvp = false, bool quiet = false, string deathText = " was slain...", bool crit = false) { if (this.immune) return 0.0; var proj = aggressor as Projectile; var plr = aggressor as Player; var ctx = new HookContext { Sender = aggressor, Player = proj != null ? (proj.Creator as Player) : plr, }; ctx.Connection = ctx.Player != null ? ctx.Player.Connection : null; var args = new HookArgs.PlayerHurt { Victim = this, Damage = Damage, HitDirection = hitDirection, Pvp = pvp, Quiet = quiet, Obituary = deathText, Critical = crit, }; HookPoints.PlayerHurt.Invoke (ref ctx, ref args); if (ctx.CheckForKick () || ctx.Result == HookResult.IGNORE) return 0.0; if (ctx.Result == HookResult.RECTIFY) { var conn = ctx.Connection; if (conn != null) { var msg = NetMessage.PrepareThreadInstance (); msg.PlayerHealthUpdate (whoAmi); msg.Send (conn); } return 0.0; } NetMessage.SendData (26, -1, plr != null ? plr.whoAmi : -1, args.Obituary, whoAmi, args.HitDirection, args.Damage, args.Pvp ? 1 : 0, args.Critical ? 1 : 0); return HurtInternal (args.Damage, args.HitDirection, args.Pvp, args.Quiet, args.Obituary, args.Critical); }
void OnPluginsLoaded(ref HookContext ctx, ref HookArgs.PluginsLoaded args) { LoadPerms(); }
void onPlayerJoin(ref HookContext ctx, ref HookArgs.PlayerEnteringGame args) { //ctx.Player.A = AccessLevel.OP; }
void OnSignEdit(ref HookContext ctx, ref HookArgs.SignTextSet args) { foreach (Region rgn in regionManager.Regions) { if (rgn.HasPoint(new Vector2(args.X, args.Y))) { if (ctx.Sender is Player) { if (IsRestrictedForUser(ctx.Player, rgn, DoorChange)) { ctx.SetResult(HookResult.IGNORE); ctx.Player.sendMessage("You cannot edit this area!", ChatColor.Red); return; } } } } }
void OnServerStateChange(ref HookContext ctx, ref HookArgs.ServerStateChange args) { if (args.ServerChangeState == ServerState.LOADED) regionManager.LoadRegions(); }
void OnProjectileReceived(ref HookContext ctx, ref HookArgs.ProjectileReceived args) { Vector2 Position = new Vector2(args.X, args.Y); foreach (Region rgn in regionManager.Regions) { if (rgn.HasPoint(Position / 16)) { if (rgn.ProjectileList.Contains("*") || rgn.ProjectileList.Contains(args.Type.ToString()))// || //rgn.ProjectileList.Contains(args.Projectile.Name.ToLower().Replace(" ", ""))) { if (IsRestrictedForUser(ctx.Player, rgn, ProjectileUse)) { ctx.SetResult(HookResult.ERASE); ctx.Player.sendMessage("You cannot edit this area!", ChatColor.Red); return; } } } } }
void OnPluginsLoaded(ref HookContext ctx, ref HookArgs.PluginsLoaded args) { UsingPermissions = IsRunningPermissions(); if (UsingPermissions) Log("Using Permissions."); else Log("No Permissions Found\nUsing Internal User System"); }
void OnPlayerWorldAlteration(ref HookContext ctx, ref HookArgs.PlayerWorldAlteration args) { Vector2 Position = new Vector2(args.X, args.Y); if (args.TileWasPlaced && args.Type == SelectorItem && selection.isInSelectionlist(ctx.Player) && ctx.Player.Op) { ctx.SetResult(HookResult.RECTIFY); SelectorPos = !SelectorPos; Vector2[] mousePoints = selection.GetSelection(ctx.Player); if (!SelectorPos) mousePoints[0] = Position; else mousePoints[1] = Position; selection.SetSelection(ctx.Player, mousePoints); ctx.Player.sendMessage(String.Format("You have selected block at {0},{1}, {2} position", Position.X, Position.Y, (!SelectorPos) ? "First" : "Second"), ChatColor.Green); return; } foreach (Region rgn in regionManager.Regions) { if (rgn.HasPoint(Position)) { if (IsRestrictedForUser(ctx.Player, rgn, ((args.TileWasRemoved || args.WallWasRemoved) ? TileBreak : TilePlace))) { ctx.SetResult(WorldAlter); ctx.Player.sendMessage("You cannot edit this area!", ChatColor.Red); return; } } } }
void OnPlayerEnteredGame(ref HookContext ctx, ref HookArgs.PlayerEnteredGame args) { /* If a player left without finishing the region, Clear it or the next player can use it. */ if (selection.isInSelectionlist(ctx.Player)) selection.RemovePlayer(ctx.Player); }
void OnLiquidFlowReceived(ref HookContext ctx, ref HookArgs.LiquidFlowReceived args) { Vector2 Position = new Vector2(args.X, args.Y); foreach (Region rgn in regionManager.Regions) { if (rgn.HasPoint(Position)) { if (IsRestrictedForUser(ctx.Player, rgn, LiquidFlow)) { ctx.SetResult(HookResult.ERASE); ctx.Player.sendMessage("You cannot edit this area!", ChatColor.Red); return; } } } }
void OnDoorStateChange(ref HookContext ctx, ref HookArgs.DoorStateChanged args) { foreach (Region rgn in regionManager.Regions) { if (rgn.HasPoint(new Vector2(args.X, args.Y))) { if (ctx.Sender is Player) { Player player = ctx.Sender as Player; if (IsRestrictedForUser(player, rgn, DoorChange)) { ctx.SetResult(HookResult.RECTIFY); player.sendMessage("You cannot edit this area!", ChatColor.Red); return; } } else if (ctx.Sender is NPC) { if (rgn.RestrictedNPCs) { ctx.SetResult(HookResult.RECTIFY); //[TODO] look into RECIFYing for NPC's, They don't need to be resent, only cancelled, IGRNORE? return; } } } } }
void OnChestOpen(ref HookContext ctx, ref HookArgs.ChestOpenReceived args) { foreach (Region rgn in regionManager.Regions) { if (rgn.HasPoint(new Vector2(args.X, args.Y))) { if (ctx.Sender is Player) { if (IsRestrictedForUser(ctx.Player, rgn, DoorChange)) { ctx.SetResult(HookResult.RECTIFY); ctx.Player.sendMessage("You cannot edit this object!", ChatColor.Red); return; } } } } }
public void ItemCheck(int i) { int dmg = this.inventory[this.selectedItemIndex].damage; if (dmg > 0) { if (this.inventory[this.selectedItemIndex].Melee) { dmg = (int)((float)dmg * this.meleeDamage); } else { if (this.inventory[this.selectedItemIndex].Ranged) { dmg = (int)((float)dmg * this.rangedDamage); } else { if (this.inventory[this.selectedItemIndex].Magic) { dmg = (int)((float)dmg * this.magicDamage); } } } } Item selectedItem = inventory[selectedItemIndex]; if (selectedItem.AutoReuse && !this.noItems) { releaseUseItem = true; if (itemAnimation == 1 && selectedItem.Stack > 0) { itemAnimation = 0; } } if (controlUseItem && itemAnimation == 0 && releaseUseItem && selectedItem.UseStyle > 0) { bool flag = true; if (this.noItems) { flag = false; } if (selectedItem.Shoot == ProjectileType.BOOMERANG_ENCHANTED || selectedItem.Shoot == ProjectileType.FLAMARANG || selectedItem.Shoot == ProjectileType.CHAKRUM_THORN) { for (int j = 0; j < Main.maxProjectiles; j++) { if (Main.projectile[j].Active && Main.projectile[j].Owner == Main.myPlayer && Main.projectile[j].type == selectedItem.Shoot) { flag = false; } } } if (selectedItem.Shoot == ProjectileType.HOOK || selectedItem.Shoot == ProjectileType.WHIP_IVY) { for (int k = 0; k < 1000; k++) { if (Main.projectile[k].Active && Main.projectile[k].Owner == Main.myPlayer && Main.projectile[k].type == selectedItem.Shoot && Main.projectile[k].ai[0] != 2f) { flag = false; } } } if (selectedItem.Potion && flag) { if (this.potionDelay <= 0) { potionDelay = Item.POTION_DELAY; this.AddBuff(21, this.potionDelay, true); } else { flag = false; } } if (selectedItem.Mana > 0 && flag) { if (selectedItem.Type != 127 || !spaceGun) { if (statMana >= (int)((float)selectedItem.Mana * manaCost)) { statMana -= (int)((float)selectedItem.Mana * manaCost); } else { flag = false; } } } if (selectedItem.Type == 43 && Main.dayTime) { flag = false; } if (selectedItem.Type == 70 && !this.zoneEvil) { flag = false; } if (flag) { if (selectedItem.UseAmmo > 0) { flag = false; for (int l = 0; l < 44; l++) { if (l < 4 && this.ammo[l].Ammo == selectedItem.UseAmmo && this.ammo[l].Stack > 0) { flag = true; break; } if (this.inventory[l].Ammo == selectedItem.UseAmmo && this.inventory[l].Stack > 0) { flag = true; break; } } } } if (flag) { if (grappling[0] > -1) { if (controlRight) { direction = 1; } else if (controlLeft) { direction = -1; } } channel = selectedItem.Channel; attackCD = 0; if (selectedItem.Melee) { this.itemAnimation = (int)((float)selectedItem.UseAnimation * this.meleeSpeed); this.itemAnimationMax = (int)((float)selectedItem.UseAnimation * this.meleeSpeed); } else { this.itemAnimation = selectedItem.UseAnimation; this.itemAnimationMax = selectedItem.UseAnimation; } } if (flag && selectedItem.Shoot == ProjectileType.ORB_OF_LIGHT) { for (int j = 0; j < 1000; j++) { if (Main.projectile[j].Active && Main.projectile[j].Owner == i && Main.projectile[j].type == selectedItem.Shoot) { Main.projectile[j].Kill(); } } } } if (!this.controlUseItem) { this.channel = false; } if (this.itemAnimation > 0) { if (selectedItem.Mana > 0) { this.manaRegenDelay = (int)this.maxRegenDelay; } if (Main.dedServ) { itemHeight = selectedItem.Height; itemWidth = selectedItem.Width; } itemAnimation--; } else if (selectedItem.HoldStyle == 1) { if (Main.dedServ) { this.itemLocation.X = this.Position.X + (float)this.Width * 0.5f + 20f * (float)this.direction; } this.itemLocation.Y = this.Position.Y + 24f; this.itemRotation = 0f; if (this.gravDir == -1f) { this.itemRotation = -this.itemRotation; this.itemLocation.Y = this.Position.Y + (float)this.Height + (this.Position.Y - this.itemLocation.Y); } } else if (selectedItem.HoldStyle == 2) { this.itemLocation.X = this.Position.X + (float)this.Width * 0.5f + (float)(6 * this.direction); this.itemLocation.Y = this.Position.Y + 16f; this.itemRotation = 0.79f * (float)(-(float)this.direction); if (this.gravDir == -1f) { this.itemRotation = -this.itemRotation; this.itemLocation.Y = this.Position.Y + (float)this.Height + (this.Position.Y - this.itemLocation.Y); } } releaseUseItem = !controlUseItem; if (this.itemTime > 0) { this.itemTime--; } if (i == Main.myPlayer) { if (selectedItem.Shoot > 0 && itemAnimation > 0 && itemTime == 0) { ProjectileType shoot = selectedItem.Shoot; float shootSpeed = selectedItem.ShootSpeed; if (selectedItem.Melee && shoot != ProjectileType.BALL_O_HURT && shoot != ProjectileType.BLUE_MOON && shoot != ProjectileType.SUNFURY) { shootSpeed /= this.meleeSpeed; } bool flag2 = false; int damage = dmg; float knockBack = selectedItem.KnockBack; if (shoot == ProjectileType.HOOK || shoot == ProjectileType.WHIP_IVY) { grappling[0] = -1; grapCount = 0; for (int j = 0; j < Main.maxProjectiles; j++) { if (Main.projectile[j].Active && Main.projectile[j].Owner == i) { if (Main.projectile[j].type == ProjectileType.HOOK) { Main.projectile[j].Kill(); } } } } if (selectedItem.UseAmmo > 0) { Item item = null; bool flag3 = false; for (int num12 = 0; num12 < 4; num12++) { if (this.ammo[num12].Ammo == selectedItem.UseAmmo && this.ammo[num12].Stack > 0) { item = this.ammo[num12]; flag2 = true; flag3 = true; break; } } if (!flag3) { for (int num13 = 0; num13 < 44; num13++) { if (this.inventory[num13].Ammo == selectedItem.UseAmmo && this.inventory[num13].Stack > 0) { item = this.inventory[num13]; flag2 = true; break; } } } if (flag2) { if (item != null && item.Shoot != 0) { shoot = item.Shoot; } shootSpeed += item.ShootSpeed; if (item.Ranged) { damage += (int)((float)item.Damage * this.rangedDamage); } else { damage += item.damage; } if (selectedItem.UseAmmo == ProjectileType.ARROW_WOODEN && this.archery) { if (shootSpeed < 20f) { shootSpeed *= 1.2f; if (shootSpeed > 20f) { shootSpeed = 20f; } } damage = (int)((double)((float)damage) * 1.2); } if (item != null) knockBack += item.KnockBack; bool flag4 = false; if (selectedItem.Type == 98 && Main.rand.Next(3) == 0) { flag4 = true; } if (this.ammoCost80 && Main.rand.Next(5) == 0) { flag4 = true; } if (!flag4 && item != null) { item.Stack--; if (item.Stack <= 0) { item.Active = false; item.Name = ""; item.Type = 0; } } } } else { flag2 = true; } if (flag2) { if (damage == 1 && selectedItem.Type == 120) { damage = 2; } // client-code snipped here } else if (selectedItem.UseStyle == 5) { itemRotation = 0f; //NetMessage.SendData(41, -1, -1, "", this.whoAmi); } } // client code depending on tileTargetX/Y // if (selectedItem.Type >= 205 && selectedItem.Type <= 207) // { // if (Position.X / 16f - (float)Player.tileRangeX - (float)selectedItem.TileBoost <= (float)Player.tileTargetX // && (Position.X + (float)Width) / 16f + (float)Player.tileRangeX + (float)selectedItem.TileBoost - 1f >= (float)Player.tileTargetX // && Position.Y / 16f - (float)Player.tileRangeY - (float)selectedItem.TileBoost <= (float)Player.tileTargetY // && (this.Position.Y + (float)this.Height) / 16f + (float)Player.tileRangeY + (float)selectedItem.TileBoost - 2f >= (float)Player.tileTargetY) // { // showItemIcon = true; // // if (itemTime == 0 && itemAnimation > 0 && controlUseItem) // { // if (selectedItem.Type == 205) // { // bool lava = Main.tile.At(Player.tileTargetX, Player.tileTargetY).Lava; // int num10 = 0; // for (int x = Player.tileTargetX - 1; x <= Player.tileTargetX + 1; x++) // { // for (int y = Player.tileTargetY - 1; y <= Player.tileTargetY + 1; y++) // { // if (Main.tile.At(x, y).Lava == lava) // { // num10 += (int)Main.tile.At(x, y).Liquid; // } // } // } // // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Liquid > 0 && num10 > 100) // { // bool lava2 = Main.tile.At(Player.tileTargetX, Player.tileTargetY).Lava; // if (!Main.tile.At(Player.tileTargetX, Player.tileTargetY).Lava) // { // selectedItem = Registries.Item.Create(206); // } // else // { // selectedItem = Registries.Item.Create(207); // } // inventory[selectedItemIndex] = selectedItem; // // itemTime = selectedItem.UseTime; // int num11 = (int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Liquid; // Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLiquid (0); // Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLava (false); // WorldModify.SquareTileFrame(Player.tileTargetX, Player.tileTargetY, false); // // Liquid.AddWater(Player.tileTargetX, Player.tileTargetY); // // for (int x = Player.tileTargetX - 1; x <= Player.tileTargetX + 1; x++) // { // for (int y = Player.tileTargetY - 1; y <= Player.tileTargetY + 1; y++) // { // if (num11 < 256 && Main.tile.At(x, y).Lava == lava) // { // int num12 = (int)Main.tile.At(x, y).Liquid; // // if (num12 + num11 > 255) // { // num12 = 255 - num11; // } // // num11 += num12; // TileRef expr_20A0 = Main.tile.At(x, y); // expr_20A0.SetLiquid ((byte) (expr_20A0.Liquid - (byte)num12)); // Main.tile.At(x, y).SetLava (lava2); // // if (Main.tile.At(x, y).Liquid == 0) // { // Main.tile.At(x, y).SetLava (false); // } // // WorldModify.SquareTileFrame(x, y, false); // // Liquid.AddWater(x, y); // } // } // } // } // } // else if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Liquid < 200) // { // if (!Main.tile.At(Player.tileTargetX, Player.tileTargetY).Active || !Main.tileSolid[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type] || !Main.tileSolidTop[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type]) // { // if (selectedItem.Type == 207) // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Liquid == 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Lava) // { // Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLava (true); // Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLiquid (255); // WorldModify.SquareTileFrame(Player.tileTargetX, Player.tileTargetY, true); // selectedItem = Registries.Item.Create(205); // inventory[selectedItemIndex] = selectedItem; // this.itemTime = selectedItem.UseTime; // } // } // else if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Liquid == 0 || !Main.tile.At(Player.tileTargetX, Player.tileTargetY).Lava) // { // Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLava (false); // Main.tile.At(Player.tileTargetX, Player.tileTargetY).SetLiquid (255); // WorldModify.SquareTileFrame(Player.tileTargetX, Player.tileTargetY, true); // selectedItem = Registries.Item.Create(205); // inventory[selectedItemIndex] = selectedItem; // this.itemTime = selectedItem.UseTime; // } // } // } // } // } // } // // if (selectedItem.Pick > 0 || selectedItem.Axe > 0 || selectedItem.Hammer > 0) // { // if (Position.X / 16f - (float)Player.tileRangeX - (float)selectedItem.TileBoost <= (float)Player.tileTargetX // && (Position.X + (float)Width) / 16f + (float)Player.tileRangeX + (float)selectedItem.TileBoost - 1f >= (float)Player.tileTargetX // && Position.Y / 16f - (float)Player.tileRangeY - (float)selectedItem.TileBoost <= (float)Player.tileTargetY // && (Position.Y + (float)Height) / 16f + (float)Player.tileRangeY + (float)selectedItem.TileBoost - 2f >= (float)Player.tileTargetY) // { // showItemIcon = true; // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Active) // { // if (itemTime == 0 && itemAnimation > 0 && controlUseItem) // { // // if (hitTileX != Player.tileTargetX || hitTileY != Player.tileTargetY) // { // hitTile = 0; // hitTileX = Player.tileTargetX; // hitTileY = Player.tileTargetY; // } // if (Main.tileNoFail[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type]) // { // hitTile = 100; // } // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type != 27) // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 4 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 10 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 11 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 12 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 13 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 14 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 15 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 16 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 17 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 18 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 19 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 21 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 26 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 28 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 29 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 31 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 33 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 34 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 35 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 36 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 42 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 48 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 49 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 50 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 54 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 55 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 77 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 78 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 79) // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 48) // { // hitTile += selectedItem.Hammer / 3; // } // else // { // hitTile += selectedItem.Hammer; // } // // if ((double)Player.tileTargetY > Main.rockLayer // && Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 77 // && selectedItem.Hammer < 60) // { // hitTile = 0; // } // // if (selectedItem.Hammer > 0) // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 26) // { // Hurt(this.statLife / 2, -direction, false, false); // WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, true, false, false); // } // else if (hitTile >= 100) // { // hitTile = 0; // WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, false, false, false); // } // else // { // WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, true, false, false); // } // // itemTime = inventory[this.selectedItemIndex].UseTime; // } // } // else // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 5 // || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 30 // || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 72) // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 30) // { // hitTile += selectedItem.Axe * 5; // } // else // { // hitTile += selectedItem.Axe; // } // if (selectedItem.Axe > 0) // { // if (hitTile >= 100) // { // hitTile = 0; // WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, false, false, false); // } // else // { // WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, true, false, false); // } // this.itemTime = selectedItem.UseTime; // } // } // else // { // if (selectedItem.Pick > 0) // { // if (Main.tileDungeon[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type] || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 37 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 25 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 58) // { // hitTile += selectedItem.Pick / 2; // } // else // { // hitTile += selectedItem.Pick; // } // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 25 && selectedItem.Pick < 65) // { // hitTile = 0; // } // else // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 37 && selectedItem.Pick < 55) // { // hitTile = 0; // } // else // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 56 && selectedItem.Pick < 65) // { // hitTile = 0; // } // else // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 58 && selectedItem.Pick < 65) // { // hitTile = 0; // } // else // { // if (Main.tileDungeon[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type] && selectedItem.Pick < 65) // { // if ((double)Player.tileTargetX < (double)Main.maxTilesX * 0.25 || (double)Player.tileTargetX > (double)Main.maxTilesX * 0.75) // { // hitTile = 0; // } // } // } // } // } // } // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 40 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 53 || Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 59) // { // hitTile += selectedItem.Pick; // } // if (hitTile >= 100) // { // hitTile = 0; // WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, false, false, false); // } // else // { // WorldModify.KillTile(Player.tileTargetX, Player.tileTargetY, true, false, false); // } // this.itemTime = selectedItem.UseTime; // } // } // } // } // } // } // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Wall > 0) // { // if (this.itemTime == 0 && this.itemAnimation > 0 && this.controlUseItem) // { // if (selectedItem.Hammer > 0) // { // bool flag3 = true; // if (!Main.wallHouse[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Wall]) // { // flag3 = false; // for (int k = Player.tileTargetX - 1; k < Player.tileTargetX + 2; k++) // { // for (int l = Player.tileTargetY - 1; l < Player.tileTargetY + 2; l++) // { // if (Main.tile.At(k, l).Wall != Main.tile.At(Player.tileTargetX, Player.tileTargetY).Wall) // { // flag3 = true; // break; // } // } // } // } // if (flag3) // { // if (hitTileX != Player.tileTargetX || hitTileY != Player.tileTargetY) // { // hitTile = 0; // hitTileX = Player.tileTargetX; // hitTileY = Player.tileTargetY; // } // hitTile += selectedItem.Hammer; // if (hitTile >= 100) // { // hitTile = 0; // WorldModify.KillWall(Player.tileTargetX, Player.tileTargetY, false); // } // else // { // WorldModify.KillWall(Player.tileTargetX, Player.tileTargetY, true); // } // this.itemTime = selectedItem.UseTime; // } // } // } // } // } // } if (selectedItem.Type == 29 && this.itemAnimation > 0 && this.statLifeMax < 400 && this.itemTime == 0) { if (this.itemTime == 0) { this.itemTime = selectedItem.UseTime; this.statLifeMax += 20; this.statLife += 20; if (Main.myPlayer == this.whoAmi) { this.HealEffect(20); } } } if (selectedItem.Type == 109 && this.itemAnimation > 0 && this.statManaMax < 200 && this.itemTime == 0) { if (this.itemTime == 0) { this.itemTime = selectedItem.UseTime; this.statManaMax += 20; this.statMana += 20; if (Main.myPlayer == this.whoAmi) { this.ManaEffect(20); } } } // client code (tileTargetX/Y), not updated // if (selectedItem.CreateTile >= 0) // { // if (this.Position.X / 16f - (float)Player.tileRangeX - (float)selectedItem.TileBoost <= (float)Player.tileTargetX && (this.Position.X + (float)this.Width) / 16f + (float)Player.tileRangeX + (float)selectedItem.TileBoost - 1f >= (float)Player.tileTargetX && this.Position.Y / 16f - (float)Player.tileRangeY - (float)selectedItem.TileBoost <= (float)Player.tileTargetY && (this.Position.Y + (float)this.Height) / 16f + (float)Player.tileRangeY + (float)selectedItem.TileBoost - 2f >= (float)Player.tileTargetY) // { // this.showItemIcon = true; // if (!Main.tile.At(Player.tileTargetX, Player.tileTargetY).Active || selectedItem.CreateTile == 23 || selectedItem.CreateTile == 2 || selectedItem.CreateTile == 60 || selectedItem.CreateTile == 70) // { // if (this.itemTime == 0 && this.itemAnimation > 0 && this.controlUseItem) // { // bool flag4 = false; // if (selectedItem.CreateTile == 23 || selectedItem.CreateTile == 2) // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Active && Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 0) // { // flag4 = true; // } // } // else // { // if (selectedItem.CreateTile == 60 || selectedItem.CreateTile == 70) // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY).Active && Main.tile.At(Player.tileTargetX, Player.tileTargetY).Type == 59) // { // flag4 = true; // } // } // else // { // if (selectedItem.CreateTile == 4) // { // int num13 = (int)Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Type; // int num14 = (int)Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Type; // int num15 = (int)Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Type; // int num16 = (int)Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY - 1).Type; // int num17 = (int)Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY - 1).Type; // int num18 = (int)Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY - 1).Type; // int num19 = (int)Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY + 1).Type; // if (!Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active) // { // num13 = -1; // } // if (!Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Active) // { // num14 = -1; // } // if (!Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Active) // { // num15 = -1; // } // if (!Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY - 1).Active) // { // num16 = -1; // } // if (!Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY - 1).Active) // { // num17 = -1; // } // if (!Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY + 1).Active) // { // num18 = -1; // } // if (!Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY + 1).Active) // { // num19 = -1; // } // if (num13 >= 0 && Main.tileSolid[num13] && !Main.tileNoAttach[num13]) // { // flag4 = true; // } // else // { // if ((num14 >= 0 && Main.tileSolid[num14] && !Main.tileNoAttach[num14]) || (num14 == 5 && num16 == 5 && num18 == 5)) // { // flag4 = true; // } // else // { // if ((num15 >= 0 && Main.tileSolid[num15] && !Main.tileNoAttach[num15]) || (num15 == 5 && num17 == 5 && num19 == 5)) // { // flag4 = true; // } // } // } // } // else // { // if (selectedItem.CreateTile == 78) // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active && (Main.tileSolid[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Type] || Main.tileTable[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Type])) // { // flag4 = true; // } // } // else // { // if (selectedItem.CreateTile == 13 || selectedItem.CreateTile == 29 || selectedItem.CreateTile == 33 || selectedItem.CreateTile == 49) // { // if (Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active && Main.tileTable[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Type]) // { // flag4 = true; // } // } // else // { // if (selectedItem.CreateTile == 51) // { // if (Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Active || Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Wall > 0 || Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Active || Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Wall > 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active || Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Wall > 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Active || Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Wall > 0) // { // flag4 = true; // } // } // else // { // if ((Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Active && Main.tileSolid[(int)Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Type]) || Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Wall > 0 || (Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Active && Main.tileSolid[(int)Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Type]) || Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Wall > 0 || (Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active && Main.tileSolid[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Type]) || Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Wall > 0 || (Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Active && Main.tileSolid[(int)Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Type]) || Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Wall > 0) // { // flag4 = true; // } // } // } // } // } // } // } // if (flag4) // { // if (WorldModify.PlaceTile(Player.tileTargetX, Player.tileTargetY, selectedItem.CreateTile, false, false, this.whoAmi)) // { // this.itemTime = selectedItem.UseTime; // if (selectedItem.CreateTile == 15) // { // if (this.direction == 1) // { // TileRef expr_40C8 = Main.tile.At(Player.tileTargetX, Player.tileTargetY); // expr_40C8.SetFrameX ((short) (expr_40C8.FrameX + 18)); // TileRef expr_40ED = Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1); // expr_40ED.SetFrameX ((short) (expr_40ED.FrameX + 18)); // } // } // } // } // } // } // } // } // if (selectedItem.CreateWall >= 0) // { // if (this.Position.X / 16f - (float)Player.tileRangeX - (float)selectedItem.TileBoost <= (float)Player.tileTargetX && (this.Position.X + (float)this.Width) / 16f + (float)Player.tileRangeX + (float)selectedItem.TileBoost - 1f >= (float)Player.tileTargetX && this.Position.Y / 16f - (float)Player.tileRangeY - (float)selectedItem.TileBoost <= (float)Player.tileTargetY && (this.Position.Y + (float)this.Height) / 16f + (float)Player.tileRangeY + (float)selectedItem.TileBoost - 2f >= (float)Player.tileTargetY) // { // this.showItemIcon = true; // if (this.itemTime == 0 && this.itemAnimation > 0 && this.controlUseItem) // { // if (Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Active || Main.tile.At(Player.tileTargetX + 1, Player.tileTargetY).Wall > 0 || Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Active || Main.tile.At(Player.tileTargetX - 1, Player.tileTargetY).Wall > 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Active || Main.tile.At(Player.tileTargetX, Player.tileTargetY + 1).Wall > 0 || Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Active || Main.tile.At(Player.tileTargetX, Player.tileTargetY - 1).Wall > 0) // { // if ((int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Wall != selectedItem.CreateWall) // { // WorldModify.PlaceWall(Player.tileTargetX, Player.tileTargetY, selectedItem.CreateWall, false); // if ((int)Main.tile.At(Player.tileTargetX, Player.tileTargetY).Wall == selectedItem.CreateWall) // { // this.itemTime = selectedItem.UseTime; // } // } // } // } // } // } } if (selectedItem.Damage >= 0 && selectedItem.Type > 0 && !selectedItem.NoMelee) { if (this.itemAnimation > 0) { bool flag5 = false; Rectangle rectangle = new Rectangle((int)this.itemLocation.X, (int)this.itemLocation.Y, 32, 32); rectangle.Width = (int)((float)rectangle.Width * selectedItem.Scale); rectangle.Height = (int)((float)rectangle.Height * selectedItem.Scale); if (this.direction == -1) { rectangle.X -= rectangle.Width; } if (this.gravDir == 1f) { rectangle.Y -= rectangle.Height; } rectangle.Y -= rectangle.Height; if (selectedItem.UseStyle == 1) { if ((double)this.itemAnimation < (double)this.itemAnimationMax * 0.333) { if (this.direction == -1) { rectangle.X -= (int)((double)rectangle.Width * 1.4 - (double)rectangle.Width); } rectangle.Width = (int)((double)rectangle.Width * 1.4); rectangle.Y += (int)((double)rectangle.Height * 0.5 * (double)this.gravDir); rectangle.Height = (int)((double)rectangle.Height * 1.1); } else { if ((double)this.itemAnimation >= (double)this.itemAnimationMax * 0.666) { if (this.direction == 1) { rectangle.X -= (int)((double)rectangle.Width * 1.2); } rectangle.Width *= 2; rectangle.Y -= (int)(((double)rectangle.Height * 1.4 - (double)rectangle.Height) * (double)this.gravDir); rectangle.Height = (int)((double)rectangle.Height * 1.4); } } } else { if (selectedItem.UseStyle == 3) { if ((double)this.itemAnimation > (double)this.itemAnimationMax * 0.666) { flag5 = true; } else { if (this.direction == -1) { rectangle.X -= (int)((double)rectangle.Width * 1.4 - (double)rectangle.Width); } rectangle.Width = (int)((double)rectangle.Width * 1.4); rectangle.Y += (int)((double)rectangle.Height * 0.6); rectangle.Height = (int)((double)rectangle.Height * 0.6); } } } if (!flag5) { #if CLIENT_CODE if (Main.myPlayer == i) { int dmgg = (int) (selectedItem.Damage * this.meleeDamage); int num21 = rectangle.X / 16; int num22 = (rectangle.X + rectangle.Width) / 16 + 1; int num23 = rectangle.Y / 16; int num24 = (rectangle.Y + rectangle.Height) / 16 + 1; for (int k = num21; k < num22; k++) { for (int l = num23; l < num24; l++) { if (Main.tile.At(k, l).Type == 3 || Main.tile.At(k, l).Type == 24 || Main.tile.At(k, l).Type == 28 || Main.tile.At(k, l).Type == 32 || Main.tile.At(k, l).Type == 51 || Main.tile.At(k, l).Type == 52 || Main.tile.At(k, l).Type == 61 || Main.tile.At(k, l).Type == 62 || Main.tile.At(k, l).Type == 69 || Main.tile.At(k, l).Type == 71 || Main.tile.At(k, l).Type == 73 || Main.tile.At(k, l).Type == 74) { WorldModify.KillTile(k, l, false, false, false); } } } for (int j = 0; j < NPC.MAX_NPCS; j++) { var npc = Main.npcs[j]; if (npc.Active && npc.immune[i] == 0 && this.attackCD == 0 && !npc.friendly) { Rectangle value = new Rectangle((int)npc.Position.X, (int)npc.Position.Y, npc.Width, npc.Height); if (rectangle.Intersects(value)) { if (npc.noTileCollide || Collision.CanHit(this.Position, this.Width, this.Height, npc.Position, npc.Width, npc.Height)) { bool crit = false; if (Main.rand.Next(1, 101) <= this.meleeCrit) { crit = true; } int dmggg = Main.DamageVar(dmgg); this.StatusNPC (selectedItem.Type, npc); npc.StrikeNPC (dmggg, selectedItem.KnockBack, this.direction, crit); npc.immune[i] = (ushort) this.itemAnimation; this.attackCD = (int)((double)this.itemAnimationMax * 0.33); } } } } if (this.hostile) { for (int j = 0; j < 255; j++) { var player = Main.players[j]; if (j != i && player.Active && player.hostile && !player.immune && !player.dead) { if (this.team == 0 || this.team != player.team) { Rectangle value2 = new Rectangle((int)player.Position.X, (int)player.Position.Y, player.Width, player.Height); if (rectangle.Intersects(value2)) { bool crit = false; if (Main.rand.Next(1, 101) <= 10) { crit = true; } int dmggg = Main.DamageVar(dmgg); this.StatusPvP (selectedItem.Type, player); if (Collision.CanHit(this.Position, this.Width, this.Height, player.Position, player.Width, player.Height)) { player.Hurt (dmggg, this.direction, true, false, "", crit); NetMessage.SendData(26, -1, -1, "", j, (float)this.direction, (float)selectedItem.Damage, 1f, crit ? 1 : 0); this.attackCD = (int)((double)this.itemAnimationMax * 0.33); } } } } } } } #endif //CLIENT_CODE } } } if (this.itemTime == 0 && this.itemAnimation > 0) { if (selectedItem.HealLife > 0) { this.statLife += selectedItem.HealLife; this.itemTime = selectedItem.UseTime; if (Main.myPlayer == this.whoAmi) { this.HealEffect(selectedItem.HealLife); } } if (selectedItem.HealMana > 0) { this.statMana += selectedItem.HealMana; this.itemTime = selectedItem.UseTime; if (Main.myPlayer == this.whoAmi) { this.ManaEffect(selectedItem.HealMana); } } if (selectedItem.BuffType > 0) { if (this.whoAmi == Main.myPlayer) { this.AddBuff (selectedItem.BuffType, selectedItem.BuffTime, true); } this.itemTime = selectedItem.UseTime; } } if (this.itemTime == 0 && this.itemAnimation > 0 && selectedItem.Type == 361) { this.itemTime = selectedItem.UseTime; if (Main.invasionType == 0) { var ctx = new HookContext { Connection = Connection, Sender = this, Player = this, }; var args = new HookArgs.PlayerTriggeredEvent { Type = WorldEventType.INVASION, }; HookPoints.PlayerTriggeredEvent.Invoke (ref ctx, ref args); if (ctx.CheckForKick ()) return; else if (ctx.Result != HookResult.IGNORE) { ProgramLog.Users.Log ("{0} @ {1}: Invasion triggered by {2}.", IPAddress, whoAmi, Name); NetMessage.SendData (Packet.PLAYER_CHAT, -1, -1, string.Concat (Name, " has summoned an invasion!"), 255, 255, 128, 150); Main.invasionDelay = 0; Main.StartInvasion(); } } } if (this.itemTime == 0 && this.itemAnimation > 0 && (selectedItem.Type == 43 || selectedItem.Type == 70)) { this.itemTime = selectedItem.UseTime; bool flag6 = false; int num25 = 4; if (selectedItem.Type == 43) { num25 = 4; } else { if (selectedItem.Type == 70) { num25 = 13; } } for (int j = 0; j < 1000; j++) { if (Main.npcs[j].Active && Main.npcs[j].Type == num25) { flag6 = true; break; } } if (flag6) { #if CLIENT_CODE if (Main.myPlayer == this.whoAmi) { this.Hurt(this.statLife * (this.statDefense + 1), -this.direction, false, false); } #endif //CLIENT_CODE } else if ( (selectedItem.Type == 43 && !Main.dayTime) || (selectedItem.Type == 70 && zoneEvil) ) { var ctx = new HookContext { Connection = Connection, Sender = this, Player = this, }; var args = new HookArgs.PlayerTriggeredEvent { X = (int) (Position.X/16), Y = (int) (Position.Y/16), Type = WorldEventType.BOSS, Name = selectedItem.Type == 43 ? "Eye of Cthulhu" : "Eater of Worlds", }; HookPoints.PlayerTriggeredEvent.Invoke (ref ctx, ref args); if (ctx.CheckForKick ()) return; else if (ctx.Result != HookResult.IGNORE) { if (selectedItem.Type == 43) { ProgramLog.Users.Log ("{0} @ {1}: Eye of Cthulhu summoned by {2}.", IPAddress, whoAmi, Name); NetMessage.SendData (Packet.PLAYER_CHAT, -1, -1, string.Concat (Name, " has summoned the Eye of Cthulhu!"), 255, 255, 128, 150); NPC.SpawnOnPlayer(Main.players[i], i, 4); } else if (selectedItem.Type == 70) { ProgramLog.Users.Log ("{0} @ {1}: Eater of Worlds summoned by {2}.", IPAddress, whoAmi, Name); NetMessage.SendData (Packet.PLAYER_CHAT, -1, -1, string.Concat (Name, " has summoned the Eater of Worlds!"), 255, 255, 128, 150); NPC.SpawnOnPlayer(Main.players[i], i, 13); } } } } if (selectedItem.Type == 50 && this.itemAnimation > 0) { if (this.itemTime == 0) { this.itemTime = selectedItem.UseTime; } else { if (this.itemTime == selectedItem.UseTime / 2) { this.grappling[0] = -1; this.grapCount = 0; for (int j = 0; j < 1000; j++) { if (Main.projectile[j].Active && Main.projectile[j].Owner == i) { if (Main.projectile[j].aiStyle == 7) { Main.projectile[j].Kill(); } } } this.Spawn(); } } } if (i == Main.myPlayer) { if (this.itemTime == selectedItem.UseTime && selectedItem.Consumable) { bool flag11 = true; if (selectedItem.Ranged && this.ammoCost80 && Main.rand.Next(5) == 0) { flag11 = false; } if (flag11) { selectedItem.Stack--; if (selectedItem.Stack <= 0) { this.itemTime = this.itemAnimation; } } } if (selectedItem.Stack <= 0 && this.itemAnimation == 0) { inventory[selectedItemIndex] = new Item(); } } }
internal bool Teleport(int tx, int ty, bool retrying) { if (Main.players[whoAmi] != this) { ProgramLog.Error.Log ("Attempt to teleport inactive player {0}.", Name ?? IPAddress); return false; } if (!retrying && System.Threading.Interlocked.CompareExchange (ref this.teleportInProgress, 1, 0) != 0) { ProgramLog.Error.Log ("Teleportation of player {0} already in progress.", Name ?? IPAddress); return false; } if (tx < 0 || ty < 0 || tx >= Main.maxTilesX || ty >= Main.maxTilesY) { ProgramLog.Error.Log ("Attempt to teleport player {0} to invalid location: {1}, {2}.", Name ?? IPAddress, tx, ty); return false; } var ctx = new HookContext { Connection = this.Connection, Player = this, Sender = this, }; var args = new HookArgs.PlayerTeleport { ToLocation = new Vector2(tx, ty) }; HookPoints.PlayerTeleport.Invoke(ref ctx, ref args); if (ctx.Result == HookResult.IGNORE) return false; bool changeSpawn = false; int ox = Main.spawnTileX; int oy = Main.spawnTileY; if (SpawnX >= 0 && SpawnY >= 0) { changeSpawn = true; ox = SpawnX; oy = SpawnY; } else if (OldSpawnX >= 0 && OldSpawnY >= 0) { changeSpawn = true; ox = OldSpawnX; oy = OldSpawnY; } var slot = NetPlay.slots[whoAmi]; int sx = tx / 200; int sy = ty / 150; // send up to 9 sections around the player int fromX = Math.Max (0, sx - 1); int fromY = Math.Max (0, sy - 1); int toX = Math.Min (sx + 1, Main.maxTilesX/200-1); int toY = Math.Min (sy + 1, Main.maxTilesY/150-1); int sections = 0; for (int x = fromX; x <= toX; x++) { for (int y = fromY; y <= toY; y++) { if (! slot.tileSection[x, y]) { sections += 1; } } } var msg = NetMessage.PrepareThreadInstance (); if (sections > 0) { msg.SendTileLoading (sections * 150, "Teleporting..."); msg.Send (whoAmi); msg.Clear (); for (int x = fromX; x <= toX; x++) { for (int y = fromY; y <= toY; y++) { if (! slot.tileSection[x, y]) { NetMessage.SendSection (whoAmi, x, y); } } } msg.SendTileConfirm (fromX, fromY, toX, toY); msg.Send (whoAmi); msg.Clear (); } // kill players' hooks and vines foreach (var proj in Main.projectile) { if (proj.Active && proj.Owner == whoAmi && (proj.type == ProjectileType.HOOK || proj.type == ProjectileType.WHIP_IVY)) { proj.Active = false; proj.type = ProjectileType.UNKNOWN; msg.Projectile (proj); } } msg.Broadcast (); msg.Clear (); int left = 0; int right = -1; if (changeSpawn && oy > 1) { // invalidate player's bed temporarily // we used to kill a tile under the bed, but that could cause // side-effects, like killing objects hanging from the ceiling below left = Math.Max (0, ox - 4); right = Math.Min (ox + 4, Main.maxTilesX); while (left < Main.maxTilesX && Main.tile.At (left, oy - 1).Type != 79) left += 1; while (right > 0 && Main.tile.At (right, oy - 1).Type != 79) right -= 1; for (int x = left; x <= right; x++) { var data = Main.tile.At (x, oy - 1).Data; data.Active = false; msg.SingleTileSquare (x, oy - 1, data); data = Main.tile.At (x, oy - 2).Data; data.Active = false; msg.SingleTileSquare (x, oy - 2, data); } } // change the global spawn point msg.WorldData (tx, ty); // trigger respawn TeleSpawnX = tx; TeleSpawnY = ty; msg.ReceivingPlayerJoined (whoAmi); // fix holes at target location int fx = Math.Max (0, Math.Min (Main.maxTilesX - 8, tx - 4)); int fy = Math.Max (0, Math.Min (Main.maxTilesY - 8, ty - 4)); msg.TileSquare (7, fx, fy); // msg.Send (whoAmi); // msg.Clear (); if (changeSpawn && oy > 1) { // restore player's bed msg.TileSquare (1, ox, oy); if (right - left >= 0 && oy >= 2) msg.TileSquare (right - left + 1, left, oy - 2); } // restore the global spawn point msg.WorldData (); msg.Send (whoAmi); return true; }
void OnServerStateChange(ref HookContext ctx, ref HookArgs.ServerStateChange args) { if (args.ServerChangeState == ServerState.LOADED) { //imports all the region files into the mysql table //on the first time the plugin is loaded with mysql enabled if (!imported && mysqlenabled) { int numimported = regionManager.import(); mysql.setValue("regionfiles-imported", "True"); mysql.Save(false); ProgramLog.Plugin.Log("Imported {0} Regions.", numimported); } regionManager.LoadRegions(); } }