public override void Execute(CommandQueue queue, CommandEntry entry) { TemplateObject cb = entry.GetArgumentObject(queue, 0); if (cb.ToString() == "\0CALLBACK") { return; } if (entry.InnerCommandBlock == null) { queue.HandleError(entry, "Invalid or missing command block!"); return; } ListTag mode = ListTag.For(cb); List <ItemStack> items = new List <ItemStack>(); for (int i = 1; i < entry.Arguments.Count; i++) { ItemTag required = ItemTag.For(TheServer, entry.GetArgumentObject(queue, i)); if (required == null) { queue.HandleError(entry, "Invalid required item!"); return; } items.Add(required.Internal); } TheServer.Recipes.AddRecipe(RecipeRegistry.ModeFor(mode), entry.InnerCommandBlock, entry.BlockStart, items.ToArray()); queue.CurrentEntry.Index = entry.BlockEnd + 2; if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Added recipe!"); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { bool enable = BooleanTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal; EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { zombie.Internal.UFM_AIDisabled = !enable; if (entry.ShouldShowGood(queue)) { entry.Good(queue, "AI for a zombie " + (enable ? "enabled!" : "disabled!")); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { animal.Internal.UFM_AIDisabled = !enable; if (entry.ShouldShowGood(queue)) { entry.Good(queue, "AI for an animal " + (enable ? "enabled!" : "disabled!")); } return; } queue.HandleError(entry, "That entity doesn't have AI!"); }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { bool enable = BooleanTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal; EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { zombie.Internal.UFM_AIDisabled = !enable; if (entry.ShouldShowGood(queue)) { entry.Good(queue, "AI for a zombie " + (enable ? "enabled!" : "disabled!")); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { animal.Internal.UFM_AIDisabled = !enable; if (entry.ShouldShowGood(queue)) { entry.Good(queue, "AI for an animal " + (enable ? "enabled!" : "disabled!")); } return; } queue.HandleError(entry, "That entity doesn't have AI!"); }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { bool enable = BooleanTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal; EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } BarricadeTag barricadeTag; byte x; byte y; ushort plant; ushort index; if (entity.TryGetBarricade(out barricadeTag, out x, out y, out plant, out index)) { UnityEngine.GameObject obj = barricadeTag.Internal.gameObject; InteractableDoor door = obj.GetComponent <InteractableDoor>(); if (door != null) { SendMessage("tellToggleDoor", x, y, plant, index, !door.isOpen); barricadeTag.InternalData.barricade.state[16] = (byte)(!door.isOpen ? 0 : 1); return; } InteractableFire fire = obj.GetComponent <InteractableFire>(); if (fire != null) { SendMessage("tellToggleFire", x, y, plant, index, !fire.isLit); barricadeTag.InternalData.barricade.state[0] = (byte)(!fire.isLit ? 0 : 1); return; } InteractableGenerator generator = obj.GetComponent <InteractableGenerator>(); if (generator != null) { SendMessage("tellToggleGenerator", x, y, plant, index, !generator.isPowered); barricadeTag.InternalData.barricade.state[0] = (byte)(!generator.isPowered ? 0 : 1); EffectManager.sendEffect(8, EffectManager.SMALL, barricadeTag.Internal.position); return; } InteractableSafezone safezone = obj.GetComponent <InteractableSafezone>(); if (generator != null) { SendMessage("tellToggleSafezone", x, y, plant, index, !safezone.isPowered); barricadeTag.InternalData.barricade.state[0] = (byte)(!safezone.isPowered ? 0 : 1); EffectManager.sendEffect(8, EffectManager.SMALL, barricadeTag.Internal.position); return; } InteractableSpot spot = obj.GetComponent <InteractableSpot>(); if (spot != null) { SendMessage("tellToggleSpot", x, y, plant, index, !spot.isPowered); barricadeTag.InternalData.barricade.state[0] = (byte)(!spot.isPowered ? 0 : 1); EffectManager.sendEffect(8, EffectManager.SMALL, barricadeTag.Internal.position); return; } } queue.HandleError(entry, "That entity isn't powerable!"); }
public override void Execute(CommandQueue queue, CommandEntry entry) { TemplateObject cb = entry.GetArgumentObject(queue, 0); if (cb.ToString() == "\0CALLBACK") { return; } if (entry.InnerCommandBlock == null) { queue.HandleError(entry, "Invalid or missing command block!"); return; } ListTag mode = ListTag.For(cb); List<ItemStack> items = new List<ItemStack>(); for (int i = 1; i < entry.Arguments.Count; i++) { ItemTag required = ItemTag.For(TheServer, entry.GetArgumentObject(queue, i)); if (required == null) { queue.HandleError(entry, "Invalid required item!"); return; } items.Add(required.Internal); } TheServer.Recipes.AddRecipe(RecipeRegistry.ModeFor(mode), entry.InnerCommandBlock, entry.BlockStart, items.ToArray()); queue.CurrentEntry.Index = entry.BlockEnd + 2; if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Added recipe!"); } }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 1)); if (num.Internal <= 0) { queue.HandleError(entry, "Must provide a number that is greater than 0!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { Zombie inZomb = zombie.Internal; inZomb.maxHealth = (ushort)num.Internal; if (inZomb.health > inZomb.maxHealth) { inZomb.health = inZomb.maxHealth; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully set health of a zombie to " + inZomb.maxHealth + "!"); } return; } PlayerTag player; if (entity.TryGetPlayer(out player)) { GameObject playerObj = player.Internal.player.gameObject; UFMHealthController controller = playerObj.GetComponent <UFMHealthController>(); if (controller == null) { controller = playerObj.AddComponent <UFMHealthController>(); } controller.maxHealth = (uint)num.Internal; PlayerLife life = player.Internal.player.life; byte curr = life.health; controller.health = curr >= controller.maxHealth ? controller.maxHealth : curr; life._health = controller.Translate(); life.channel.send("tellHealth", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { life.health }); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully set max health of a player to " + controller.maxHealth + "!"); } return; } queue.HandleError(entry, "That entity can't be healed!"); }
public override void Execute(CommandQueue queue, CommandEntry entry) { bool enable = BooleanTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal; EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } BarricadeTag barricadeTag; byte x; byte y; ushort plant; ushort index; if (entity.TryGetBarricade(out barricadeTag, out x, out y, out plant, out index)) { UnityEngine.GameObject obj = barricadeTag.Internal.gameObject; InteractableDoor door = obj.GetComponent<InteractableDoor>(); if (door != null) { SendMessage("tellToggleDoor", x, y, plant, index, !door.isOpen); barricadeTag.InternalData.barricade.state[16] = (byte)(!door.isOpen ? 0 : 1); return; } InteractableFire fire = obj.GetComponent<InteractableFire>(); if (fire != null) { SendMessage("tellToggleFire", x, y, plant, index, !fire.isLit); barricadeTag.InternalData.barricade.state[0] = (byte)(!fire.isLit ? 0 : 1); return; } InteractableGenerator generator = obj.GetComponent<InteractableGenerator>(); if (generator != null) { SendMessage("tellToggleGenerator", x, y, plant, index, !generator.isPowered); barricadeTag.InternalData.barricade.state[0] = (byte)(!generator.isPowered ? 0 : 1); EffectManager.sendEffect(8, EffectManager.SMALL, barricadeTag.Internal.position); return; } InteractableSafezone safezone = obj.GetComponent<InteractableSafezone>(); if (generator != null) { SendMessage("tellToggleSafezone", x, y, plant, index, !safezone.isPowered); barricadeTag.InternalData.barricade.state[0] = (byte)(!safezone.isPowered ? 0 : 1); EffectManager.sendEffect(8, EffectManager.SMALL, barricadeTag.Internal.position); return; } InteractableSpot spot = obj.GetComponent<InteractableSpot>(); if (spot != null) { SendMessage("tellToggleSpot", x, y, plant, index, !spot.isPowered); barricadeTag.InternalData.barricade.state[0] = (byte)(!spot.isPowered ? 0 : 1); EffectManager.sendEffect(8, EffectManager.SMALL, barricadeTag.Internal.position); return; } } queue.HandleError(entry, "That entity isn't powerable!"); }
public override void Execute(CommandQueue queue, CommandEntry entry) { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 1)); if (num.Internal <= 0) { queue.HandleError(entry, "Must provide a number that is greater than 0!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { Zombie inZomb = zombie.Internal; inZomb.maxHealth = (ushort)num.Internal; if (inZomb.health > inZomb.maxHealth) { inZomb.health = inZomb.maxHealth; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully set health of a zombie to " + inZomb.maxHealth + "!"); } return; } PlayerTag player; if (entity.TryGetPlayer(out player)) { GameObject playerObj = player.Internal.player.gameObject; UFMHealthController controller = playerObj.GetComponent<UFMHealthController>(); if (controller == null) { controller = playerObj.AddComponent<UFMHealthController>(); } controller.maxHealth = (uint)num.Internal; PlayerLife life = player.Internal.player.life; byte curr = life.health; controller.health = curr >= controller.maxHealth ? controller.maxHealth : curr; life._health = controller.Translate(); life.channel.send("tellHealth", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { life.health }); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully set max health of a player to " + controller.maxHealth + "!"); } return; } queue.HandleError(entry, "That entity can't be healed!"); }
/// <summary>Executes the command.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> public static void Execute(CommandQueue queue, CommandEntry entry) { string configName = entry.GetArgument(queue, 0).ToLowerFast(); AutoConfiguration config = queue.Engine.Context.GetConfig(configName); if (config is null) { queue.HandleError(entry, $"Invalid config name '{TextStyle.SeparateVal(configName)}' - are you sure you typed it correctly?"); return; } string configKey = entry.GetArgument(queue, 1); AutoConfiguration.Internal.SingleFieldData field = config.TryGetFieldInternalData(configKey, out AutoConfiguration section, true); if (field is null) { queue.HandleError(entry, $"Invalid config setting key '{TextStyle.SeparateVal(configKey)}' - are you sure you typed it correctly?"); return; } TemplateObject newValue = entry.GetArgumentObject(queue, 2); object rawValue = ConvertForType(field.Field.FieldType, newValue, queue); field.SetValue(section, rawValue); field.OnChanged?.Invoke(); if (queue.ShouldShowGood()) { queue.GoodOutput($"For config '{TextStyle.SeparateVal(configName)}', set '{TextStyle.SeparateVal(configKey)}' to '{TextStyle.SeparateVal(rawValue)}'"); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { ListTag players = ListTag.For(entry.GetArgument(queue, 0)); TemplateObject tcolor = entry.GetArgumentObject(queue, 1); ColorTag color = ColorTag.For(tcolor); if (color == null) { queue.HandleError(entry, "Invalid color: " + TagParser.Escape(tcolor.ToString())); return; } string tchatter = entry.GetArgument(queue, 2); PlayerTag chatter = PlayerTag.For(tchatter); if (chatter == null) { queue.HandleError(entry, "Invalid chatting player: " + TagParser.Escape(tchatter)); return; } string message = entry.GetArgument(queue, 3); foreach (TemplateObject tplayer in players.ListEntries) { PlayerTag player = PlayerTag.For(tplayer.ToString()); if (player == null) { queue.HandleError(entry, "Invalid player: " + TagParser.Escape(tplayer.ToString())); continue; } ChatManager.manager.channel.send("tellChat", player.Internal.playerID.steamID, ESteamPacket.UPDATE_UNRELIABLE_BUFFER, chatter.Internal.playerID.steamID, (byte)0 /* TODO: Configurable mode? */, color.Internal, message); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully sent a message."); } } }
public override void Execute(CommandQueue queue, CommandEntry entry) { TemplateObject tcolor = entry.GetArgumentObject(queue, 0); ColorTag color = ColorTag.For(tcolor); if (color == null) { queue.HandleError(entry, "Invalid color: " + TagParser.Escape(tcolor.ToString())); return; } string message = entry.GetArgument(queue, 1); EChatMode chatMode = EChatMode.SAY; if (entry.Arguments.Count > 2) { string mode = entry.GetArgument(queue, 2); try { chatMode = (EChatMode)Enum.Parse(typeof(EChatMode), mode.ToUpper()); } catch (ArgumentException) { queue.HandleError(entry, "Invalid chat mode: " + mode); return; } } ChatManager.manager.channel.send("tellChat", ESteamCall.OTHERS, ESteamPacket.UPDATE_UNRELIABLE_BUFFER, new object[] { CSteamID.Nil, (byte)chatMode, color.Internal, message }); }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { TemplateObject tcolor = entry.GetArgumentObject(queue, 0); ColorTag color = ColorTag.For(tcolor); if (color == null) { queue.HandleError(entry, "Invalid color: " + TagParser.Escape(tcolor.ToString())); return; } string message = entry.GetArgument(queue, 1); EChatMode chatMode = EChatMode.SAY; if (entry.Arguments.Count > 2) { string mode = entry.GetArgument(queue, 2); try { chatMode = (EChatMode)Enum.Parse(typeof(EChatMode), mode.ToUpper()); } catch (ArgumentException) { queue.HandleError(entry, "Invalid chat mode: " + mode); return; } } ChatManager.manager.channel.send("tellChat", ESteamCall.OTHERS, ESteamPacket.UPDATE_UNRELIABLE_BUFFER, new object[] { CSteamID.Nil, (byte)chatMode, color.Internal, message }); }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { try { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 1)); if (num == null) { queue.HandleError(entry, "Invalid amount number!"); return; } PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); if (player == null) { queue.HandleError(entry, "Invalid player!"); return; } player.Internal.player.life.askWarm((uint)num.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully adjusted the warmth level of a player!"); } } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to adjust player's warmth level: " + ex.ToString()); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { try { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 1)); if (num == null) { queue.HandleError(entry, "Invalid amount number!"); return; } PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); if (player == null) { queue.HandleError(entry, "Invalid player!"); return; } player.Internal.player.life.askWarm((uint)num.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully adjusted the warmth level of a player!"); } } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to adjust player's warmth level: " + ex.ToString()); } }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { try { LocationTag loc = LocationTag.For(entry.GetArgument(queue, 1)); if (loc == null) { queue.HandleError(entry, "Invalid location!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } PlayerTag player; if (entity.TryGetPlayer(out player)) { player.Internal.player.gameObject.AddComponent <LaunchComponent>().LaunchPlayer(loc.ToVector3()); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully launched player " + TagParser.Escape(player.ToString()) + " to " + TagParser.Escape(loc.ToString()) + "!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { zombie.Internal.gameObject.AddComponent <LaunchComponent>().Launch(loc.ToVector3()); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully launched zombie " + TagParser.Escape(zombie.ToString()) + " to " + TagParser.Escape(loc.ToString()) + "!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { animal.Internal.gameObject.AddComponent <LaunchComponent>().Launch(loc.ToVector3()); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully launched animal " + TagParser.Escape(animal.ToString()) + " to " + TagParser.Escape(loc.ToString()) + "!"); } return; } ItemEntityTag item; if (entity.TryGetItem(out item)) { // TODO: Find some way to teleport items, barricades, etc without voiding the InstanceID? } queue.HandleError(entry, "That entity can't be launched!"); } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to launch entity: " + ex.ToString()); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { try { LocationTag loc = LocationTag.For(entry.GetArgument(queue, 1)); if (loc == null) { queue.HandleError(entry, "Invalid location!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } PlayerTag player; if (entity.TryGetPlayer(out player)) { player.Internal.player.gameObject.AddComponent<LaunchComponent>().LaunchPlayer(loc.ToVector3()); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully launched player " + TagParser.Escape(player.ToString()) + " to " + TagParser.Escape(loc.ToString()) + "!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { zombie.Internal.gameObject.AddComponent<LaunchComponent>().Launch(loc.ToVector3()); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully launched zombie " + TagParser.Escape(zombie.ToString()) + " to " + TagParser.Escape(loc.ToString()) + "!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { animal.Internal.gameObject.AddComponent<LaunchComponent>().Launch(loc.ToVector3()); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully launched animal " + TagParser.Escape(animal.ToString()) + " to " + TagParser.Escape(loc.ToString()) + "!"); } return; } ItemEntityTag item; if (entity.TryGetItem(out item)) { // TODO: Find some way to teleport items, barricades, etc without voiding the InstanceID? } queue.HandleError(entry, "That entity can't be launched!"); } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to launch entity: " + ex.ToString()); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { if (entry.Arguments.Count < 2) { ShowUsage(queue, entry); return; } ListTag players = ListTag.For(entry.GetArgumentObject(queue, 0)); ListTag items = ListTag.For(entry.GetArgumentObject(queue, 1)); List <ItemStack> itemlist = new List <ItemStack>(); for (int i = 0; i < items.ListEntries.Count; i++) { ItemTag item = ItemTag.For(TheServer, items.ListEntries[i]); if (item == null) { queue.HandleError(entry, "Invalid item!"); return; } itemlist.Add(item.Internal); } List <PlayerEntity> playerlist = new List <PlayerEntity>(); for (int i = 0; i < players.ListEntries.Count; i++) { PlayerTag player = PlayerTag.For(TheServer, players.ListEntries[i]); if (player == null) { queue.HandleError(entry, "Invalid player: " + TagParser.Escape(items.ListEntries[i].ToString())); return; } playerlist.Add(player.Internal); } foreach (PlayerEntity player in playerlist) { foreach (ItemStack item in itemlist) { player.Items.GiveItem(item); } } if (entry.ShouldShowGood(queue)) { entry.Good(queue, itemlist.Count + " item(s) given to " + playerlist.Count + " player(s)!"); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { IntegerTag itag = IntegerTag.TryFor(entry.GetArgumentObject(queue, 0)); uint ti = (uint)itag.Internal; SDG.Unturned.LightingManager.time = ti; if (entry.ShouldShowGood(queue)) { entry.Good(queue, "World time set to " + ti + "!"); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { if (entry.Arguments.Count < 2) { ShowUsage(queue, entry); return; } ListTag players = ListTag.For(entry.GetArgumentObject(queue, 0)); ListTag items = ListTag.For(entry.GetArgumentObject(queue, 1)); List<ItemStack> itemlist = new List<ItemStack>(); for (int i = 0; i < items.ListEntries.Count; i++) { ItemTag item = ItemTag.For(TheServer, items.ListEntries[i]); if (item == null) { queue.HandleError(entry, "Invalid item!"); return; } itemlist.Add(item.Internal); } List<PlayerEntity> playerlist = new List<PlayerEntity>(); for (int i = 0; i < players.ListEntries.Count; i++) { PlayerTag player = PlayerTag.For(TheServer, players.ListEntries[i]); if (player == null) { queue.HandleError(entry, "Invalid player: " + TagParser.Escape(items.ListEntries[i].ToString())); return; } playerlist.Add(player.Internal); } foreach (PlayerEntity player in playerlist) { foreach (ItemStack item in itemlist) { player.Items.GiveItem(item); } } if (entry.ShouldShowGood(queue)) { entry.Good(queue, itemlist.Count + " item(s) given to " + playerlist.Count + " player(s)!"); } }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { IntegerTag itag = IntegerTag.TryFor(entry.GetArgumentObject(queue, 0)); uint ti = (uint)itag.Internal; SDG.Unturned.LightingManager.time = ti; if (entry.ShouldShowGood(queue)) { entry.Good(queue, "World time set to " + ti + "!"); } }
/// <summary>Executes the command.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> public static void Execute(CommandQueue queue, CommandEntry entry) { if (entry.Arguments.Length > 1 && BooleanTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal) { throw new Exception("FreneticScript induced exception: '" + entry.GetArgument(queue, 0) + "'"); } else { queue.HandleError(entry, entry.GetArgument(queue, 0)); } }
/// <summary>Executes the command.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> public static void Execute(CommandQueue queue, CommandEntry entry) { TemplateObject arg1 = entry.GetArgumentObject(queue, 0); BooleanTag bt = BooleanTag.TryFor(arg1); if (bt == null || !bt.Internal) { queue.HandleError(entry, "Assertion failed: " + entry.GetArgument(queue, 1)); return; } entry.GoodOutput(queue, "Assert command passed, assertion valid!"); }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { LocationTag loc = LocationTag.For(entry.GetArgument(queue, 1)); if (loc == null) { queue.HandleError(entry, "Invalid location!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { zombie.Internal.target.position = loc.ToVector3(); zombie.Internal.seeker.canMove = true; zombie.Internal.seeker.canSearch = true; zombie.Internal.path = EZombiePath.RUSH; // TODO: Option for this? if (!zombie.Internal.isTicking) { zombie.Internal.isTicking = true; ZombieManager.tickingZombies.Add(zombie.Internal); } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully started a zombie walking to " + TagParser.Escape(loc.ToString()) + "!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { animal.Internal.target = loc.ToVector3(); if (!animal.Internal.isTicking) { animal.Internal.isTicking = true; AnimalManager.tickingAnimals.Add(animal.Internal); } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully started an animal walking to " + TagParser.Escape(loc.ToString()) + "!"); } return; } queue.HandleError(entry, "That entity can't be made to walk!"); }
/// <summary>Executes the numbered input part of the repeat command, without debug.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> public static bool TryRepeatNumberedCIL_NoDebug(CommandQueue queue, CommandEntry entry) { int target = (int)IntegerTag.TryFor(entry.GetArgumentObject(queue, 0)).Internal; if (target <= 0) { return(false); } entry.SetData(queue, new RepeatCommandData() { Index = 1, Total = target }); return(true); }
public override void Execute(CommandQueue queue, CommandEntry entry) { LocationTag loc = LocationTag.For(entry.GetArgument(queue, 1)); if (loc == null) { queue.HandleError(entry, "Invalid location!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { zombie.Internal.target.position = loc.ToVector3(); zombie.Internal.seeker.canMove = true; zombie.Internal.seeker.canSearch = true; zombie.Internal.path = EZombiePath.RUSH; // TODO: Option for this? if (!zombie.Internal.isTicking) { zombie.Internal.isTicking = true; ZombieManager.tickingZombies.Add(zombie.Internal); } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully started a zombie walking to " + TagParser.Escape(loc.ToString()) + "!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { animal.Internal.target = loc.ToVector3(); if (!animal.Internal.isTicking) { animal.Internal.isTicking = true; AnimalManager.tickingAnimals.Add(animal.Internal); } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully started an animal walking to " + TagParser.Escape(loc.ToString()) + "!"); } return; } queue.HandleError(entry, "That entity can't be made to walk!"); }
/// <summary>Executes the list input part of the foreached command, without debug.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> /// <param name="listItem">Dynamic tag to hold the item in the list.</param> public static bool TryForeachNumberedCIL_NoDebug(CommandQueue queue, CommandEntry entry, DynamicTag listItem) { ListTag list = ListTag.CreateFor(entry.GetArgumentObject(queue, 1)); if (list.Internal.Count == 0) { return(false); } entry.SetData(queue, new ForeachCommandData() { Index = 0, List = list.Internal }); listItem.Internal = list.Internal[0]; return(true); }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { try { BooleanTag boolean = BooleanTag.TryFor(entry.GetArgumentObject(queue, 1)); if (boolean == null) { queue.HandleError(entry, "Invalid boolean!"); return; } PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); if (player == null) { queue.HandleError(entry, "Invalid player!"); return; } bool value = boolean.Internal; PlayerLife life = player.Internal.player.life; if (life.isBroken != value) { if (value) { life.breakLegs(); } else { life._isBroken = false; life.channel.send("tellBroken", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { life._isBroken }); } entry.Good(queue, "Successfully adjusted the broken legs of player " + TagParser.Escape(player.ToString()) + " to " + TagParser.Escape(boolean.ToString()) + "!"); } else { entry.Good(queue, "Player " + TagParser.Escape(player.ToString()) + " already has their broken legs set to " + TagParser.Escape(boolean.ToString()) + "!"); } } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to adjust player's broken legs: " + ex.ToString()); } }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 2)); if (num == null) { queue.HandleError(entry, "Invalid amount number!"); return; } PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); if (player == null) { queue.HandleError(entry, "Invalid player!"); return; } bool award = entry.GetArgument(queue, 1) == "award"; if (num.Internal > 0) { PlayerSkills skills = player.Internal.player.skills; if (award) { skills._experience += (uint)num.Internal; } else { skills._experience -= (uint)num.Internal; } skills.channel.send("tellExperience", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { skills.experience }); } else { queue.HandleError(entry, "Amount must be positive!"); return; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully " + (award ? "awarded experience to" : "took experience from") + " a player!"); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { try { BooleanTag boolean = BooleanTag.TryFor(entry.GetArgumentObject(queue, 1)); if (boolean == null) { queue.HandleError(entry, "Invalid boolean!"); return; } PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); if (player == null) { queue.HandleError(entry, "Invalid player!"); return; } bool value = boolean.Internal; PlayerLife life = player.Internal.player.life; if (life.isBroken != value) { if (value) { life.breakLegs(); } else { life._isBroken = false; life.channel.send("tellBroken", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { life._isBroken }); } entry.Good(queue, "Successfully adjusted the broken legs of player " + TagParser.Escape(player.ToString()) + " to " + TagParser.Escape(boolean.ToString()) + "!"); } else { entry.Good(queue, "Player " + TagParser.Escape(player.ToString()) + " already has their broken legs set to " + TagParser.Escape(boolean.ToString()) + "!"); } } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to adjust player's broken legs: " + ex.ToString()); } }
/// <summary>Executes the command.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> public static void Execute(CommandQueue queue, CommandEntry entry) { int count = 1; if (entry.Arguments.Length > 0) { IntegerTag inter = IntegerTag.TryFor(entry.GetArgumentObject(queue, 0)); if (inter != null) { count = (int)inter.Internal; } } if (count <= 0) { ShowUsage(queue, entry); return; } for (int i = 0; i < count; i++) { CompiledCommandRunnable runnable = queue.CurrentRunnable; for (int ind = runnable.Index; ind < runnable.Entry.Entries.Length; ind++) { CommandEntry tentry = runnable.Entry.Entries[ind]; if (tentry.Command.Meta.IsBreakable && tentry.IsCallback) { runnable.Index = ind + 1; goto completed; } } if (queue.RunningStack.Count > 1) { queue.RunningStack.Pop(); } else { queue.HandleError(entry, "Not in that many blocks!"); return; } completed: continue; } entry.GoodOutput(queue, "Broke free successfully."); }
public override void Execute(CommandQueue queue, CommandEntry entry) { try { BooleanTag boolean = BooleanTag.TryFor(entry.GetArgumentObject(queue, 1)); if (boolean == null) { queue.HandleError(entry, "Invalid boolean!"); return; } PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); if (player == null) { queue.HandleError(entry, "Invalid player!"); return; } bool value = boolean.Internal; PlayerLife life = player.Internal.player.life; if (life._isBleeding != value) { life._isBleeding = value; if (value) { uint sim = life.player.input.simulation; life.lastBleeding = sim; life.lastBleed = sim; } life.channel.send("tellBleeding", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { life.isBleeding }); entry.Good(queue, "Successfully adjusted the bleeding of player " + TagParser.Escape(player.ToString()) + " to " + TagParser.Escape(boolean.ToString()) + "!"); } else { entry.Good(queue, "Player " + TagParser.Escape(player.ToString()) + " already has their bleeding set to " + TagParser.Escape(boolean.ToString()) + "!"); } } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to adjust player's bleeding state: " + ex.ToString()); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 2)); if (num == null) { queue.HandleError(entry, "Invalid amount number!"); return; } PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); if (player == null) { queue.HandleError(entry, "Invalid player!"); return; } bool award = entry.GetArgument(queue, 1) == "award"; if (num.Internal > 0) { PlayerSkills skills = player.Internal.player.skills; if (award) { skills._experience += (uint)num.Internal; } else { skills._experience -= (uint)num.Internal; } skills.channel.send("tellExperience", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { skills.experience }); } else { queue.HandleError(entry, "Amount must be positive!"); return; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully " + (award ? "awarded experience to" : "took experience from") + " a player!"); } }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); bool primary = entry.GetArgument(queue, 1) == "primary"; bool start = BooleanTag.TryFor(entry.GetArgumentObject(queue, 2)).Internal; if (player.Internal.player.equipment.useable == null) { entry.Bad(queue, "Failed to use item, holding nothing."); return; } if (primary) { if (start) { player.Internal.player.equipment.useable.startPrimary(); } else { player.Internal.player.equipment.useable.stopPrimary(); } } else { if (start) { player.Internal.player.equipment.useable.startSecondary(); } else { player.Internal.player.equipment.useable.stopSecondary(); } } player.Internal.player.equipment.useable.tick(); player.Internal.player.equipment.useable.tock(player.Internal.player.input.clock); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Player is " + (start ? "now" : "no longer") + " using the " + (primary ? "primary" : "secondary") + " mode on their held item!"); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); bool primary = entry.GetArgument(queue, 1) == "primary"; bool start = BooleanTag.TryFor(entry.GetArgumentObject(queue, 2)).Internal; if (player.Internal.player.equipment.useable == null) { entry.Bad(queue, "Failed to use item, holding nothing."); return; } if (primary) { if (start) { player.Internal.player.equipment.useable.startPrimary(); } else { player.Internal.player.equipment.useable.stopPrimary(); } } else { if (start) { player.Internal.player.equipment.useable.startSecondary(); } else { player.Internal.player.equipment.useable.stopSecondary(); } } player.Internal.player.equipment.useable.tick(); player.Internal.player.equipment.useable.tock(player.Internal.player.input.clock); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Player is " + (start ? "now" : "no longer") + " using the " + (primary ? "primary" : "secondary") + " mode on their held item!"); } }
/// <summary>Executes the command.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> public static void Execute(CommandQueue queue, CommandEntry entry) { NumberTag delay = NumberTag.TryFor(entry.GetArgumentObject(queue, 0)); if (delay is null) { queue.HandleError(entry, "Invalid delay value - not a number!"); return; } if (queue.Delayable) { if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Delaying for " + TextStyle.Separate + delay.Internal + TextStyle.Base + " seconds."); } queue.Wait = delay.Internal; } else { queue.HandleError(entry, "Cannot delay, inside an instant queue!"); } }
/// <summary>Executes the numbered input part of the repeat command.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> public static bool TryRepeatNumberedCIL(CommandQueue queue, CommandEntry entry) { int target = (int)IntegerTag.TryFor(entry.GetArgumentObject(queue, 0)).Internal; if (target <= 0) { if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Not repeating."); } return(false); } entry.SetData(queue, new RepeatCommandData() { Index = 1, Total = target }); if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Repeating " + TextStyle.Separate + target + TextStyle.Base + " times..."); } return(true); }
/// <summary>Executes the list input part of the foreached command.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> /// <param name="listItem">Dynamic tag to hold the item in the list.</param> public static bool TryForeachNumberedCIL(CommandQueue queue, CommandEntry entry, DynamicTag listItem) { ListTag list = ListTag.CreateFor(entry.GetArgumentObject(queue, 1)); if (list.Internal.Count == 0) { if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Not looping."); } return(false); } entry.SetData(queue, new ForeachCommandData() { Index = 0, List = list.Internal }); listItem.Internal = list.Internal[0]; if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Looping " + TextStyle.Separate + list.Internal.Count + TextStyle.Base + " times..."); } return(true); }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { ListTag players = ListTag.For(entry.GetArgument(queue, 0)); TemplateObject tcolor = entry.GetArgumentObject(queue, 1); ColorTag color = ColorTag.For(tcolor); if (color == null) { queue.HandleError(entry, "Invalid color: " + TagParser.Escape(tcolor.ToString())); return; } string tchatter = entry.GetArgument(queue, 2); PlayerTag chatter = PlayerTag.For(tchatter); if (chatter == null) { queue.HandleError(entry, "Invalid chatting player: " + TagParser.Escape(tchatter)); return; } string message = entry.GetArgument(queue, 3); foreach (TemplateObject tplayer in players.ListEntries) { PlayerTag player = PlayerTag.For(tplayer.ToString()); if (player == null) { queue.HandleError(entry, "Invalid player: " + TagParser.Escape(tplayer.ToString())); continue; } ChatManager.manager.channel.send("tellChat", player.Internal.playerID.steamID, ESteamPacket.UPDATE_UNRELIABLE_BUFFER, chatter.Internal.playerID.steamID, (byte)0 /* TODO: Configurable mode? */, color.Internal, message); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully sent a message."); } } }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { try { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 1)); if (num == null) { queue.HandleError(entry, "Invalid amount number!"); return; } PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); if (player == null) { queue.HandleError(entry, "Invalid player!"); return; } int amount = (int)num.Internal; PlayerLife life = player.Internal.player.life; if (amount >= 0) { life.askRest((byte)amount); } else { life.askTire((byte)-amount); } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully adjusted the stamina level of a player!"); } } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to adjust player's stamina level: " + ex.ToString()); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { try { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 1)); if (num == null) { queue.HandleError(entry, "Invalid amount number!"); return; } PlayerTag player = PlayerTag.For(entry.GetArgument(queue, 0)); if (player == null) { queue.HandleError(entry, "Invalid player!"); return; } int amount = (int)num.Internal; PlayerLife life = player.Internal.player.life; if (amount >= 0) { life.askBreath((byte)amount); } else { life.askSuffocate((byte)-amount); } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully adjusted the oxygen level of a player!"); } } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to adjust player's oxygen level: " + ex.ToString()); } }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { string animation = entry.GetArgument(queue, 1).ToUpperInvariant(); EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } PlayerTag player; if (entity.TryGetPlayer(out player)) { try { player.Internal.player.animator.sendGesture((EPlayerGesture)Enum.Parse(typeof(EPlayerGesture), animation), true); //player.Internal.player.animator.askGesture(player.Internal.playerID.steamID, (byte)((EPlayerGesture)Enum.Parse(typeof(EPlayerGesture), animation))); } catch (ArgumentException) { queue.HandleError(entry, "Invalid animation specified!"); return; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Animated a player!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { int ind = animation.IndexOf('_'); string after = animation.Substring(ind + 1); animation = animation.Substring(0, ind); if (animation == "STARTLE") { ZombieManager.sendZombieStartle(zombie.Internal, (byte)IntegerTag.TryFor(after).Internal); } else if (animation == "STUN") { ZombieManager.sendZombieStun(zombie.Internal, (byte)IntegerTag.TryFor(after).Internal); } else if (animation == "ATTACK") { ZombieManager.sendZombieAttack(zombie.Internal, (byte)IntegerTag.TryFor(after).Internal); } else { queue.HandleError(entry, "Invalid animation specified!"); return; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Animated an animal!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { if (animation == "STARTLE") { AnimalManager.sendAnimalStartle(animal.Internal); } else if (animation == "PANIC") { AnimalManager.sendAnimalPanic(animal.Internal); } else if (animation == "ATTACK") { AnimalManager.sendAnimalAttack(animal.Internal); } else { queue.HandleError(entry, "Invalid animation specified!"); return; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Animated an animal!"); } return; } queue.HandleError(entry, "That entity can't be animated!"); }
public override void Execute(CommandQueue queue, CommandEntry entry) { try { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 1)); if (num.Internal < 0) { queue.HandleError(entry, "Must provide a non-negative number!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } PlayerTag player; if (entity.TryGetPlayer(out player)) { UFMHealthController healthController = player.Internal.player.gameObject.GetComponent<UFMHealthController>(); uint amount = (uint)num.Internal; if (healthController != null) { healthController.Heal(amount); amount = (uint)(((double)amount / healthController.maxHealth) * 100.0); } PlayerLife life = player.Internal.player.life; life._health = healthController.Translate(); life.channel.send("tellHealth", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { life.health }); if (entry.ShouldShowGood(queue)) { uint finalHealth = healthController != null ? healthController.health : life.health; entry.Good(queue, "Successfully healed a player to a new health value of " + finalHealth + "!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { Zombie inZomb = zombie.Internal; inZomb.health += (ushort)num.Internal; if (inZomb.health > inZomb.maxHealth) { inZomb.health = inZomb.maxHealth; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed a zombie to a new health value of " + inZomb.health + "!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { Animal inAnimal = animal.Internal; inAnimal.health += (ushort)num.Internal; if (inAnimal.health > inAnimal.asset.health) { inAnimal.health = inAnimal.asset.health; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed an animal to a new health value of " + inAnimal.health + "!"); } return; } BarricadeTag barricade; if (entity.TryGetBarricade(out barricade)) { Barricade inBarricade = barricade.InternalData.barricade; inBarricade.health += (ushort)num.Internal; ushort max = ((ItemBarricadeAsset)Assets.find(EAssetType.ITEM, inBarricade.id)).health; if (inBarricade.health > max) { inBarricade.health = max; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed a barricade to a new health value of " + inBarricade.health + "!"); } return; } ResourceTag resource; if (entity.TryGetResource(out resource)) { ResourceSpawnpoint inResource = resource.Internal; inResource.health += (ushort)num.Internal; ushort max = ((ResourceAsset)Assets.find(EAssetType.RESOURCE, inResource.id)).health; if (inResource.health > max) { inResource.health = max; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed a resource to a new health value of " + inResource.health + "!"); } return; } StructureTag structure; if (entity.TryGetStructure(out structure)) { Structure inStructure = structure.InternalData.structure; inStructure.health += (ushort)num.Internal; ushort max = ((ItemStructureAsset)Assets.find(EAssetType.ITEM, inStructure.id)).health; if (inStructure.health > max) { inStructure.health = max; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed a structure to a new health value of " + inStructure.health + "!"); } return; } VehicleTag vehicle; if (entity.TryGetVehicle(out vehicle)) { vehicle.Internal.askRepair((ushort)num.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed a vehicle to a new health value of " + vehicle.Internal.health + "!"); } return; } queue.HandleError(entry, "That entity can't be healed!"); } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, ("Failed to heal entity: " + ex.ToString())); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } PlayerTag player; if (entity.TryGetPlayer(out player)) // TODO: Kick? { Provider.kick(player.Internal.playerID.steamID, "Removed forcibly."); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully removed a player!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) // TODO: Remove! { zombie.Internal.health = 0; ZombieManager.sendZombieDead(zombie.Internal, new Vector3(9999, 9999, -9999)); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully removed a zombie!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { animal.Internal.health = 0; AnimalManager.sendAnimalDead(animal.Internal, new Vector3(9999, 9999, -9999)); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully removed an animal!"); } return; } BarricadeTag barricade; if (entity.TryGetBarricade(out barricade)) { // TODO: Use BarricadeManager magic to remove properly? barricade.InternalData.barricade.askDamage(barricade.InternalData.barricade.health); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully destroyed a barricade!"); } return; } ResourceTag resource; if (entity.TryGetResource(out resource)) // TODO: Remove! { // TODO: Use ResourceManager magic to remove properly? resource.Internal.askDamage(resource.Internal.health); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully destroyed a resource!"); } return; } StructureTag structure; if (entity.TryGetStructure(out structure)) // TODO: Remove! { // TODO: Use StructureManager magic to remove properly? structure.InternalData.structure.askDamage(structure.InternalData.structure.health); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully destroyed a structure!"); } return; } VehicleTag vehicle; if (entity.TryGetVehicle(out vehicle)) // TODO: Remove! { vehicle.Internal.health = 0; VehicleManager.sendVehicleExploded(vehicle.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully removed a vehicle!"); } return; } queue.HandleError(entry, "That entity can't be damaged!"); }
public override void Execute(CommandQueue queue, CommandEntry entry) { try { LocationTag loc = LocationTag.For(entry.GetArgument(queue, 1)); if (loc == null) { queue.HandleError(entry, "Invalid location!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } PlayerTag player; if (entity.TryGetPlayer(out player)) { player.Internal.player.sendTeleport(loc.ToVector3(), 0); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully teleported a player to " + TagParser.Escape(loc.ToString()) + "!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { zombie.Internal.transform.position = loc.ToVector3(); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully teleported a zombie to " + TagParser.Escape(loc.ToString()) + "!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { animal.Internal.transform.position = loc.ToVector3(); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully teleported an animal to " + TagParser.Escape(loc.ToString()) + "!"); } return; } ItemEntityTag item; if (entity.TryGetItem(out item)) { // TODO: Find some way to teleport items, barricades, etc without voiding the InstanceID? /* Transform transform = item.Internal.transform.parent; byte x; byte y; if (Regions.tryGetCoordinate(transform.position, out x, out y)) { ItemRegion region = ItemManager.regions[x, y]; for (byte i = 0; i < region.models.Count; i+) { if (region.models[i] == transform) { ItemManager.regions[x, y].items.RemoveAt(i); ItemModelTracker.Untrack(x, y, i); ItemManager.manager.channel.send("tellTakeItem", ESteamCall.CLIENTS, x, y, ItemManager.ITEM_REGIONS, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { x, y, loc.ToVector3() }); // Then respawn item at new location break; } } } */ } queue.HandleError(entry, "That entity can't be teleported!"); } catch (Exception ex) // TODO: Necessity of this? { queue.HandleError(entry, "Failed to teleport entity: " + ex.ToString()); } }
public static void Execute(CommandQueue queue, CommandEntry entry) { if (entry.Arguments.Count < 1) { ShowUsage(queue, entry); return; } Client TheClient = (entry.Command as CdevelCommand).TheClient; switch (entry.GetArgument(queue, 0)) { case "lightDebug": { Location pos = TheClient.Player.GetPosition(); pos.Z = pos.Z + 1; int XP = (int)Math.Floor(pos.X / Chunk.CHUNK_SIZE); int YP = (int)Math.Floor(pos.Y / Chunk.CHUNK_SIZE); int ZP = (int)Math.Floor(pos.Z / Chunk.CHUNK_SIZE); int x = (int)(Math.Floor(pos.X) - (XP * Chunk.CHUNK_SIZE)); int y = (int)(Math.Floor(pos.Y) - (YP * Chunk.CHUNK_SIZE)); int z = (int)(Math.Floor(pos.Z) - (ZP * Chunk.CHUNK_SIZE)); while (true) { Chunk ch = TheClient.TheRegion.GetChunk(new Vector3i(XP, YP, ZP)); if (ch == null) { entry.Good(queue, "Passed with flying light sources!"); goto end; } while (z < Chunk.CHUNK_SIZE) { if (ch.GetBlockAt((int)x, (int)y, (int)z).IsOpaque()) { entry.Info(queue, "Died: " + x + ", " + y + ", " + z + " -- " + XP + ", " + YP + ", " + ZP); goto end; } z++; } ZP++; z = 0; } end: break; } case "vramUsage": { long c = 0; foreach (Tuple <string, long> val in TheClient.CalculateVRAMUsage()) { entry.Info(queue, "-> " + val.Item1 + ": " + val.Item2 + " (" + (val.Item2 / 1024 / 1024) + "MB)"); c += val.Item2; } entry.Info(queue, "-> Total: " + c + " (" + (c / 1024 / 1024) + "MB)"); break; } case "speakText": { if (entry.Arguments.Count < 3) { ShowUsage(queue, entry); break; } bool male = !entry.GetArgument(queue, 1).ToString().ToLowerFast().StartsWith("f"); TextToSpeech.Speak(entry.GetArgument(queue, 2), male, entry.Arguments.Count > 3 ? (int)IntegerTag.TryFor(entry.GetArgumentObject(queue, 3)).Internal : 0); break; } case "chunkInfo": { Chunk ch = TheClient.TheRegion.GetChunk(TheClient.TheRegion.ChunkLocFor(TheClient.Player.GetPosition())); if (ch == null) { entry.Info(queue, "Chunk is null!"); break; } Vector3i chunk_pos = ch.WorldPosition; ChunkSLODHelper slod = TheClient.TheRegion.GetSLODHelp(ch.WorldPosition, false); if (slod == null) { entry.Info(queue, "No SLOD."); } else { bool isgen = slod._VBO != null && slod._VBO.generated; entry.Info(queue, "SLOD: " + slod.Coordinate + ", live chunks contained: " + slod.Users + ", verts: " + slod.FullBlock.Vertices.Count + ", generated: " + isgen); foreach (KeyValuePair <Vector3i, Chunk> entryx in TheClient.TheRegion.LoadedChunks) { if (entryx.Value.PosMultiplier < 5) { continue; } Vector3i slodposser = new Vector3i((int)Math.Floor(entryx.Key.X / (float)Constants.CHUNKS_PER_SLOD), (int)Math.Floor(entryx.Key.Y / (float)Constants.CHUNKS_PER_SLOD), (int)Math.Floor(entryx.Key.Z / (float)Constants.CHUNKS_PER_SLOD)); if (slodposser == slod.Coordinate) { entry.Info(queue, "Chunk at " + entryx.Key + " is held"); } } } entry.Info(queue, "Plants: " + ch.Plant_C + ", generated as ID: " + ch.Plant_VAO); int c = 0; long verts = 0; long verts_transp = 0; int total = 0; int total_rendered = 0; int total_rendered_transp = 0; foreach (Chunk chunk in TheClient.TheRegion.LoadedChunks.Values) { total++; if (chunk._VBOSolid != null && ch._VBOSolid != null && chunk._VBOSolid._VAO == ch._VBOSolid._VAO) { c++; } if (chunk._VBOSolid != null && chunk._VBOSolid.generated) { verts += chunk._VBOSolid.vC; total_rendered++; } if (chunk._VBOTransp != null && chunk._VBOTransp.generated) { verts_transp += chunk._VBOTransp.vC; total_rendered_transp++; } } entry.Info(queue, "Chunk rendering as " + (ch._VBOSolid == null ? "{NULL}" : ch._VBOSolid._VAO.ToString()) + ", which is seen in " + c + " chunks!"); entry.Info(queue, "Chunks: " + total + ", rendering " + verts + " solid verts and " + verts_transp + " transparent verts, with " + total_rendered + " solid-existent chunks, and " + total_rendered_transp + " transparent-existent chunks!"); break; } case "blockInfo": { BlockInternal bi = TheClient.TheRegion.GetBlockInternal(TheClient.Player.GetPosition()); entry.Info(queue, "BLOCK: Material=" + bi.Material + ", Shape=" + bi.BlockData + ", Damage=" + bi.Damage + ", Paint=" + bi.BlockPaint + ",Light=" + bi.BlockLocalData); break; } case "igniteBlock": { Location pos = TheClient.Player.GetPosition().GetUpperBlockBorder(); FireEntity fe = new FireEntity(pos, null, TheClient.TheRegion); TheClient.TheRegion.SpawnEntity(fe); break; } case "torchBlocks": { Location pos = TheClient.Player.GetPosition().GetUpperBlockBorder(); for (int x = -3; x <= 3; x++) { for (int y = -3; y <= 3; y++) { FireEntity fe = new FireEntity(pos + new Location(x, y, 0), null, TheClient.TheRegion); TheClient.TheRegion.SpawnEntity(fe); } } break; } case "lateVR": { if (!VRSupport.Available()) { entry.Info(queue, "Can't load VR. Not available!"); break; } if (TheClient.VR != null) { entry.Info(queue, "Can't load VR. Already loaded!"); break; } TheClient.VR = VRSupport.TryInit(TheClient.CWindow); TheClient.CWindow.VR = TheClient.VR; if (TheClient.VR != null) { TheClient.VR.VRScale = 1.5f; // TODO: VR Scale CVar? } break; } case "debugVR": { if (TheClient.VR == null) { entry.Info(queue, "VR not running!"); break; } entry.Info(queue, "Left: " + TheClient.VR.Left?.ToString() + " ||| Right: " + TheClient.VR.Right?.ToString()); break; } case "fogEnhance": { double time = NumberTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal; double fogVal = NumberTag.TryFor(entry.GetArgumentObject(queue, 2)).Internal; TheClient.FogEnhanceStrength = (float)fogVal; TheClient.FogEnhanceTime = time; break; } case "flashBang": { double time = NumberTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal; TheClient.MainWorldView.Flashbang(time); break; } case "earRing": { double time = NumberTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal; // TODO: Fix! //TheClient.Sounds.Deafen(time); break; } case "topInfo": { Location pos = TheClient.Player.GetPosition().GetBlockLocation(); Vector3i chunkLoc = TheClient.TheRegion.ChunkLocFor(pos); Vector2i buaPos = new Vector2i(chunkLoc.X, chunkLoc.Y); if (!TheClient.TheRegion.UpperAreas.TryGetValue(buaPos, out BlockUpperArea bua)) { entry.Info(queue, "Failed to grab Top data: Out of map?"); } else { entry.Info(queue, pos + ": " + bua.Blocks[bua.BlockIndex((int)pos.X - chunkLoc.X * Chunk.CHUNK_SIZE, (int)pos.Y - chunkLoc.Y * Chunk.CHUNK_SIZE)]); } break; } case "testDecal": { Location pos = TheClient.Player.GetPosition() + new Location(0, 0, BEPUphysics.Settings.CollisionDetectionSettings.AllowedPenetration); TheClient.AddDecal(pos, new Location(0, 0, 1), Vector4.One, 1f, "white", 15); break; } case "traceDecal": { Location pos = TheClient.Player.GetEyePosition(); Location forw = TheClient.Player.ForwardVector(); if (TheClient.TheRegion.SpecialCaseRayTrace(pos, forw, 50.0f, MaterialSolidity.FULLSOLID, TheClient.Player.IgnoreThis, out RayCastResult rcr)) { Location nrm = new Location(rcr.HitData.Normal).Normalize(); TheClient.AddDecal(new Location(rcr.HitData.Location) + nrm * 0.005, nrm, Vector4.One, 1f, "white", 15); entry.Info(queue, "Marked at normal " + nrm); } break; } case "traceDecalTarg": { Location pos = TheClient.Player.GetEyePosition(); Location forw = TheClient.Player.ForwardVector(); if (TheClient.TheRegion.SpecialCaseRayTrace(pos, forw, 50.0f, MaterialSolidity.FULLSOLID, TheClient.Player.IgnoreThis, out RayCastResult rcr)) { Location nrm = new Location(rcr.HitData.Normal).Normalize(); TheClient.AddDecal(new Location(rcr.HitData.Location) + nrm * 0.005, nrm, Vector4.One, 1f, "decal_target", 15); entry.Info(queue, "Marked at normal " + nrm); } break; } case "soundCount": { entry.Info(queue, "Sound effects: " + TheClient.Sounds.Effects.Count + ", playing now: " + TheClient.Sounds.PlayingNow.Count); break; } case "testCompute": { Chunk ch = TheClient.TheRegion.GetChunk(TheClient.TheRegion.ChunkLocFor(TheClient.Player.GetPosition())); if (ch == null) { throw new Exception("Chunk is null!"); } TheClient.VoxelComputer.sw1.Reset(); TheClient.VoxelComputer.sw1a.Reset(); TheClient.VoxelComputer.sw2.Reset(); TheClient.VoxelComputer.sw3.Reset(); TheClient.VoxelComputer.Calc(ch); entry.Good(queue, "Took: " + TheClient.VoxelComputer.sw1.ElapsedMilliseconds + " (" + TheClient.VoxelComputer.sw1a.ElapsedMilliseconds + ") / " + TheClient.VoxelComputer.sw2.ElapsedMilliseconds + " / " + TheClient.VoxelComputer.sw3.ElapsedMilliseconds); break; } case "testComputeAll": { TheClient.VoxelComputer.sw1.Reset(); TheClient.VoxelComputer.sw1a.Reset(); TheClient.VoxelComputer.sw2.Reset(); TheClient.VoxelComputer.sw3.Reset(); TheClient.VoxelComputer.Calc(TheClient.TheRegion.LoadedChunks.Values.ToArray()); entry.Good(queue, "Took: " + TheClient.VoxelComputer.sw1.ElapsedMilliseconds + " (" + TheClient.VoxelComputer.sw1a.ElapsedMilliseconds + ") / " + TheClient.VoxelComputer.sw2.ElapsedMilliseconds + " / " + TheClient.VoxelComputer.sw3.ElapsedMilliseconds); break; } default: ShowUsage(queue, entry); break; } }
/// <summary>Executes the command.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> public static void Execute(CommandQueue queue, CommandEntry entry) { if (entry.IsCallback) { return; } string type = entry.GetArgument(queue, 0).ToLowerFast(); string eventname = entry.GetArgument(queue, 1).ToLowerFast(); if (type == "clear" && eventname == "all") { foreach (KeyValuePair <string, ScriptEvent> evt in queue.Engine.Events) { evt.Value.Clear(); } if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Cleared all events."); } return; } if (!queue.Engine.Events.TryGetValue(eventname, out ScriptEvent theEvent)) { queue.HandleError(entry, "Unknown event '" + TextStyle.Separate + eventname + TextStyle.Base + "'."); return; } if (type == "clear") { theEvent.Clear(); if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Cleared event '" + TextStyle.Separate + eventname + TextStyle.Base + "' of all handlers."); } } else if (type == "remove") { if (entry.Arguments.Length < 3) { ShowUsage(queue, entry); return; } string name = entry.GetArgument(queue, 2).ToLowerFast(); bool success = theEvent.RemoveEventHandler(name); if (success) { if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Removed event handler '" + TextStyle.Separate + name + TextStyle.Base + "'."); } } else { if (BooleanTag.TryFor(entry.GetNamedArgumentObject(queue, "quiet_fail"))?.Internal ?? false) { if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Unknown event handler '" + TextStyle.Separate + name + TextStyle.Base + "'."); } } else { queue.HandleError(entry, "Unknown event handler '" + TextStyle.Separate + name + TextStyle.Base + "'."); } } } else if (type == "add") { if (entry.Arguments.Length < 3) { ShowUsage(queue, entry); return; } string name = entry.GetArgument(queue, 2).ToLowerFast(); if (entry.InnerCommandBlock == null) { queue.HandleError(entry, "Event command invalid: No block follows!"); return; } if (theEvent.HasHandler(name)) { if (BooleanTag.TryFor(entry.GetNamedArgumentObject(queue, "quiet_fail"))?.Internal ?? false) { if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Handler '" + TextStyle.Separate + name + TextStyle.Base + "' already exists!"); } } else { queue.HandleError(entry, "Handler '" + TextStyle.Separate + name + TextStyle.Base + "' already exists!"); } } double priority = 0; if (entry.Arguments.Length > 3) { priority = NumberTag.For(entry.GetArgumentObject(queue, 3), queue.Error).Internal; } List <CommandEntry> entries = new(entry.InnerCommandBlock.Length + 2); MapTag expectedContext = new(); expectedContext.Internal.Add("context", entry.System.TagTypes.Type_Map.TagForm); entries.Add(entry.System.TheRequireCommand.GenerateEntry(expectedContext, entry.ScriptName, entry.ScriptLine)); entries.AddRange(entry.InnerCommandBlock); CommandScript script = new(theEvent.Name + "__handler__" + name, CommandScript.TYPE_NAME_EVENT, entries.ToArray(), entry.System, entry.BlockStart, DebugMode.MINIMAL); theEvent.RegisterEventHandler(priority, script, name); entry.GoodOutput(queue, "Handler '" + TextStyle.Separate + name + "" + TextStyle.Base + "' defined for event '" + TextStyle.Separate + theEvent.Name + TextStyle.Base + "'."); } else { ShowUsage(queue, entry); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { string animation = entry.GetArgument(queue, 1).ToUpperInvariant(); EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } PlayerTag player; if (entity.TryGetPlayer(out player)) { try { player.Internal.player.animator.sendGesture((EPlayerGesture)Enum.Parse(typeof(EPlayerGesture), animation), true); //player.Internal.player.animator.askGesture(player.Internal.playerID.steamID, (byte)((EPlayerGesture)Enum.Parse(typeof(EPlayerGesture), animation))); } catch (ArgumentException) { queue.HandleError(entry, "Invalid animation specified!"); return; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Animated a player!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { int ind = animation.IndexOf('_'); string after = animation.Substring(ind + 1); animation = animation.Substring(0, ind); if (animation == "STARTLE") { ZombieManager.sendZombieStartle(zombie.Internal, (byte)IntegerTag.TryFor(after).Internal); } else if (animation == "STUN") { ZombieManager.sendZombieStun(zombie.Internal, (byte)IntegerTag.TryFor(after).Internal); } else if (animation == "ATTACK") { ZombieManager.sendZombieAttack(zombie.Internal, (byte)IntegerTag.TryFor(after).Internal); } else { queue.HandleError(entry, "Invalid animation specified!"); return; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Animated an animal!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { if (animation == "STARTLE") { AnimalManager.sendAnimalStartle(animal.Internal); } else if (animation == "PANIC") { AnimalManager.sendAnimalPanic(animal.Internal); } else if (animation == "ATTACK") { AnimalManager.sendAnimalAttack(animal.Internal); } else { queue.HandleError(entry, "Invalid animation specified!"); return; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Animated an animal!"); } return; } queue.HandleError(entry, "That entity can't be animated!"); }
public override void Execute(CommandQueue queue, CommandEntry entry) { try { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 1)); if (num.Internal < 0) { queue.HandleError(entry, "Must provide a non-negative number!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } EPlayerKill kill; // for use with "out EPlayerKill" parameters PlayerTag player; if (entity.TryGetPlayer(out player)) { PlayerLife life = player.Internal.player.life; UFMHealthController healthController = player.Internal.player.GetComponent<UFMHealthController>(); uint health = healthController != null ? healthController.health : life.health; if (num.Internal >= health) { uint amount = (uint)num.Internal; if (healthController != null) { healthController.health = 0; } if (amount >= byte.MaxValue) // TODO: better handling { life._health = 0; amount = 1; } life.askDamage((byte)amount, Vector3.zero, EDeathCause.KILL, ELimb.SPINE, CSteamID.Nil, out kill, null); } else { uint amount = (uint)num.Internal; if (healthController != null) { healthController.Damage((uint)num.Internal); } life._health = healthController.Translate(); life.channel.send("tellHealth", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { life.health }); } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a player by " + TagParser.Escape(num.ToString()) + "!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { zombie.Internal.askDamage((byte)num.Internal, Vector3.zero, out kill); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a zombie by " + TagParser.Escape(num.ToString()) + "!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { animal.Internal.askDamage((byte)num.Internal, Vector3.zero, out kill); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged an animal by " + TagParser.Escape(num.ToString()) + "!"); } return; } BarricadeTag barricade; if (entity.TryGetBarricade(out barricade)) { // TODO: Use BarricadeManager? barricade.InternalData.barricade.askDamage((ushort)num.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a barricade by " + TagParser.Escape(num.ToString()) + "!"); } return; } ResourceTag resource; if (entity.TryGetResource(out resource)) { // TODO: Use ResourceManager? resource.Internal.askDamage((ushort)num.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a resource by " + TagParser.Escape(num.ToString()) + "!"); } return; } StructureTag structure; if (entity.TryGetStructure(out structure)) { // TODO: Use StructureManager? structure.InternalData.structure.askDamage((ushort)num.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a structure by " + TagParser.Escape(num.ToString()) + "!"); } return; } VehicleTag vehicle; if (entity.TryGetVehicle(out vehicle)) { vehicle.Internal.askDamage((ushort)num.Internal, false); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a vehicle by " + TagParser.Escape(num.ToString()) + "!"); } return; } queue.HandleError(entry, "That entity can't be damaged!"); } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to damage entity: " + ex.ToString()); } }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { try { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 1)); if (num.Internal < 0) { queue.HandleError(entry, "Must provide a non-negative number!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } EPlayerKill kill; // for use with "out EPlayerKill" parameters PlayerTag player; if (entity.TryGetPlayer(out player)) { PlayerLife life = player.Internal.player.life; UFMHealthController healthController = player.Internal.player.GetComponent <UFMHealthController>(); uint health = healthController != null ? healthController.health : life.health; if (num.Internal >= health) { uint amount = (uint)num.Internal; if (healthController != null) { healthController.health = 0; } if (amount >= byte.MaxValue) // TODO: better handling { life._health = 0; amount = 1; } life.askDamage((byte)amount, Vector3.zero, EDeathCause.KILL, ELimb.SPINE, CSteamID.Nil, out kill, null); } else { uint amount = (uint)num.Internal; if (healthController != null) { healthController.Damage((uint)num.Internal); } life._health = healthController.Translate(); life.channel.send("tellHealth", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { life.health }); } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a player by " + TagParser.Escape(num.ToString()) + "!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { uint xp; zombie.Internal.askDamage((byte)num.Internal, Vector3.zero, out kill, out xp); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a zombie by " + TagParser.Escape(num.ToString()) + "!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { uint xp; animal.Internal.askDamage((byte)num.Internal, Vector3.zero, out kill, out xp); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged an animal by " + TagParser.Escape(num.ToString()) + "!"); } return; } BarricadeTag barricade; if (entity.TryGetBarricade(out barricade)) { // TODO: Use BarricadeManager? barricade.InternalData.barricade.askDamage((ushort)num.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a barricade by " + TagParser.Escape(num.ToString()) + "!"); } return; } ResourceTag resource; if (entity.TryGetResource(out resource)) { // TODO: Use ResourceManager? resource.Internal.askDamage((ushort)num.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a resource by " + TagParser.Escape(num.ToString()) + "!"); } return; } StructureTag structure; if (entity.TryGetStructure(out structure)) { // TODO: Use StructureManager? structure.InternalData.structure.askDamage((ushort)num.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a structure by " + TagParser.Escape(num.ToString()) + "!"); } return; } VehicleTag vehicle; if (entity.TryGetVehicle(out vehicle)) { vehicle.Internal.askDamage((ushort)num.Internal, false); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully damaged a vehicle by " + TagParser.Escape(num.ToString()) + "!"); } return; } queue.HandleError(entry, "That entity can't be damaged!"); } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, "Failed to damage entity: " + ex.ToString()); } }
public override void Execute(CommandQueue queue, CommandEntry entry) { EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } EPlayerKill kill; // for use with "out EPlayerKill" parameters PlayerTag player; if (entity.TryGetPlayer(out player)) { PlayerLife life = player.Internal.player.life; life.askDamage(life.health, Vector3.zero, EDeathCause.KILL, ELimb.SPINE, CSteamID.Nil, out kill, null); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully killed a player!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { while (!zombie.Internal.isDead) { zombie.Internal.askDamage((byte)zombie.Internal.health, Vector3.zero, out kill); } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully killed a zombie!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { while (!animal.Internal.isDead) { animal.Internal.askDamage((byte)animal.Internal.health, Vector3.zero, out kill); } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully killed an animal!"); } return; } BarricadeTag barricade; if (entity.TryGetBarricade(out barricade)) { // TODO: Use BarricadeManager? barricade.InternalData.barricade.askDamage(barricade.InternalData.barricade.health); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully destroyed a barricade!"); } return; } ResourceTag resource; if (entity.TryGetResource(out resource)) { // TODO: Use ResourceManager? resource.Internal.askDamage(resource.Internal.health); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully destroyed a resource!"); } return; } StructureTag structure; if (entity.TryGetStructure(out structure)) { // TODO: Use StructureManager? structure.InternalData.structure.askDamage(structure.InternalData.structure.health); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully destroyed a structure!"); } return; } VehicleTag vehicle; if (entity.TryGetVehicle(out vehicle)) { vehicle.Internal.askDamage(vehicle.Internal.health, false); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully destroyed a vehicle!"); } return; } queue.HandleError(entry, "That entity can't be damaged!"); }
public override void Execute(CommandQueue queue, CommandEntry entry) { if (entry.Arguments.Count < 1) { ShowUsage(queue, entry); return; } switch (entry.GetArgument(queue, 0)) { case "lightDebug": { Location pos = TheClient.Player.GetPosition(); pos.Z = pos.Z + 1; int XP = (int)Math.Floor(pos.X / Chunk.CHUNK_SIZE); int YP = (int)Math.Floor(pos.Y / Chunk.CHUNK_SIZE); int ZP = (int)Math.Floor(pos.Z / Chunk.CHUNK_SIZE); int x = (int)(Math.Floor(pos.X) - (XP * Chunk.CHUNK_SIZE)); int y = (int)(Math.Floor(pos.Y) - (YP * Chunk.CHUNK_SIZE)); int z = (int)(Math.Floor(pos.Z) - (ZP * Chunk.CHUNK_SIZE)); while (true) { Chunk ch = TheClient.TheRegion.GetChunk(new Vector3i(XP, YP, ZP)); if (ch == null) { entry.Good(queue, "Passed with flying light sources!"); goto end; } while (z < Chunk.CHUNK_SIZE) { if (ch.GetBlockAt((int)x, (int)y, (int)z).IsOpaque()) { entry.Info(queue, "Died: " + x + ", " + y + ", " + z + " -- " + XP + ", " + YP + ", " + ZP); goto end; } z++; } ZP++; z = 0; } end: break; } case "vramUsage": { long c = 0; foreach (Tuple <string, long> val in TheClient.CalculateVRAMUsage()) { entry.Info(queue, "-> " + val.Item1 + ": " + val.Item2 + " (" + (val.Item2 / 1024 / 1024) + "MB)"); c += val.Item2; } entry.Info(queue, "-> Total: " + c + " (" + (c / 1024 / 1024) + "MB)"); break; } case "speakText": { if (entry.Arguments.Count < 3) { ShowUsage(queue, entry); break; } bool male = !entry.GetArgument(queue, 1).ToString().ToLowerFast().StartsWith("f"); TextToSpeech.Speak(entry.GetArgument(queue, 2), male, entry.Arguments.Count > 3 ? (int)IntegerTag.TryFor(entry.GetArgumentObject(queue, 3)).Internal : 0); break; } case "chunkInfo": { Chunk ch = TheClient.TheRegion.GetChunk(TheClient.TheRegion.ChunkLocFor(TheClient.Player.GetPosition())); if (ch == null) { entry.Info(queue, "Chunk is null!"); break; } entry.Info(queue, "Plants: " + ch.Plant_C + ", generated as ID: " + ch.Plant_VAO); int c = 0; long verts = 0; long verts_transp = 0; int total = 0; int total_rendered = 0; int total_rendered_transp = 0; foreach (Chunk chunk in TheClient.TheRegion.LoadedChunks.Values) { total++; if (chunk._VBOSolid != null && ch._VBOSolid != null && chunk._VBOSolid._VAO == ch._VBOSolid._VAO) { c++; } if (chunk._VBOSolid != null && chunk._VBOSolid.generated) { verts += chunk._VBOSolid.vC; total_rendered++; } if (chunk._VBOTransp != null && chunk._VBOTransp.generated) { verts_transp += chunk._VBOTransp.vC; total_rendered_transp++; } } entry.Info(queue, "Chunk rendering as " + (ch._VBOSolid == null ? "{NULL}" : ch._VBOSolid._VAO.ToString()) + ", which is seen in " + c + " chunks!"); entry.Info(queue, "Chunks: " + total + ", rendering " + verts + " solid verts and " + verts_transp + " transparent verts, with " + total_rendered + " solid-existent chunks, and " + total_rendered_transp + " transparent-existent chunks!"); break; } case "blockInfo": { BlockInternal bi = TheClient.TheRegion.GetBlockInternal(TheClient.Player.GetPosition()); entry.Info(queue, "BLOCK: Material=" + bi.Material + ", Shape=" + bi.BlockData + ", Damage=" + bi.Damage + ", Paint=" + bi.BlockPaint + ",Light=" + bi.BlockLocalData); break; } case "igniteBlock": { Location pos = TheClient.Player.GetPosition().GetUpperBlockBorder(); FireEntity fe = new FireEntity(pos, null, TheClient.TheRegion); TheClient.TheRegion.SpawnEntity(fe); break; } case "torchBlocks": { Location pos = TheClient.Player.GetPosition().GetUpperBlockBorder(); for (int x = -3; x <= 3; x++) { for (int y = -3; y <= 3; y++) { FireEntity fe = new FireEntity(pos + new Location(x, y, 0), null, TheClient.TheRegion); TheClient.TheRegion.SpawnEntity(fe); } } break; } case "lateVR": { if (!VRSupport.Available()) { entry.Info(queue, "Can't load VR. Not available!"); break; } if (TheClient.VR != null) { entry.Info(queue, "Can't load VR. Already loaded!"); break; } TheClient.VR = VRSupport.TryInit(TheClient); break; } case "fogEnhance": { double time = NumberTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal; double fogVal = NumberTag.TryFor(entry.GetArgumentObject(queue, 2)).Internal; TheClient.FogEnhanceStrength = (float)fogVal; TheClient.FogEnhanceTime = time; break; } case "flashBang": { double time = NumberTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal; TheClient.MainWorldView.Flashbang(time); break; } case "earRing": { double time = NumberTag.TryFor(entry.GetArgumentObject(queue, 1)).Internal; TheClient.Sounds.Deafen(time); break; } case "topInfo": { Location pos = TheClient.Player.GetPosition().GetBlockLocation(); Vector3i chunkLoc = TheClient.TheRegion.ChunkLocFor(pos); Vector2i buaPos = new Vector2i(chunkLoc.X, chunkLoc.Y); if (!TheClient.TheRegion.UpperAreas.TryGetValue(buaPos, out BlockUpperArea bua)) { entry.Info(queue, "Failed to grab Top data: Out of map?"); } else { entry.Info(queue, pos + ": " + bua.Blocks[bua.BlockIndex((int)pos.X - chunkLoc.X * Chunk.CHUNK_SIZE, (int)pos.Y - chunkLoc.Y * Chunk.CHUNK_SIZE)]); } break; } case "testDecal": { Location pos = TheClient.Player.GetPosition() + new Location(0, 0, BEPUphysics.Settings.CollisionDetectionSettings.AllowedPenetration); TheClient.AddDecal(pos, new Location(0, 0, 1), Vector4.One, 1f, "white", 15); break; } case "traceDecal": { Location pos = TheClient.Player.GetEyePosition(); Location forw = TheClient.Player.ForwardVector(); if (TheClient.TheRegion.SpecialCaseRayTrace(pos, forw, 50.0f, MaterialSolidity.FULLSOLID, TheClient.Player.IgnoreThis, out RayCastResult rcr)) { Location nrm = new Location(rcr.HitData.Normal).Normalize(); TheClient.AddDecal(new Location(rcr.HitData.Location) + nrm * 0.005, nrm, Vector4.One, 1f, "white", 15); entry.Info(queue, "Marked at normal " + nrm); } break; } case "soundCount": { entry.Info(queue, "Sound effects: " + TheClient.Sounds.Effects.Count + ", playing now: " + TheClient.Sounds.PlayingNow.Count); break; } default: ShowUsage(queue, entry); break; } }
public override void Execute(FreneticScript.CommandSystem.CommandQueue queue, CommandEntry entry) { try { IntegerTag num = IntegerTag.TryFor(entry.GetArgumentObject(queue, 1)); if (num.Internal < 0) { queue.HandleError(entry, "Must provide a non-negative number!"); return; } EntityTag entity = EntityTag.For(entry.GetArgumentObject(queue, 0)); if (entity == null) { queue.HandleError(entry, "Invalid entity!"); return; } PlayerTag player; if (entity.TryGetPlayer(out player)) { UFMHealthController healthController = player.Internal.player.gameObject.GetComponent <UFMHealthController>(); uint amount = (uint)num.Internal; if (healthController != null) { healthController.Heal(amount); amount = (uint)(((double)amount / healthController.maxHealth) * 100.0); } PlayerLife life = player.Internal.player.life; life._health = healthController.Translate(); life.channel.send("tellHealth", ESteamCall.OWNER, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { life.health }); if (entry.ShouldShowGood(queue)) { uint finalHealth = healthController != null ? healthController.health : life.health; entry.Good(queue, "Successfully healed a player to a new health value of " + finalHealth + "!"); } return; } ZombieTag zombie; if (entity.TryGetZombie(out zombie)) { Zombie inZomb = zombie.Internal; inZomb.health += (ushort)num.Internal; if (inZomb.health > inZomb.maxHealth) { inZomb.health = inZomb.maxHealth; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed a zombie to a new health value of " + inZomb.health + "!"); } return; } AnimalTag animal; if (entity.TryGetAnimal(out animal)) { Animal inAnimal = animal.Internal; inAnimal.health += (ushort)num.Internal; if (inAnimal.health > inAnimal.asset.health) { inAnimal.health = inAnimal.asset.health; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed an animal to a new health value of " + inAnimal.health + "!"); } return; } BarricadeTag barricade; if (entity.TryGetBarricade(out barricade)) { Barricade inBarricade = barricade.InternalData.barricade; inBarricade.health += (ushort)num.Internal; ushort max = ((ItemBarricadeAsset)Assets.find(EAssetType.ITEM, inBarricade.id)).health; if (inBarricade.health > max) { inBarricade.health = max; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed a barricade to a new health value of " + inBarricade.health + "!"); } return; } ResourceTag resource; if (entity.TryGetResource(out resource)) { ResourceSpawnpoint inResource = resource.Internal; inResource.health += (ushort)num.Internal; ushort max = ((ResourceAsset)Assets.find(EAssetType.RESOURCE, inResource.id)).health; if (inResource.health > max) { inResource.health = max; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed a resource to a new health value of " + inResource.health + "!"); } return; } StructureTag structure; if (entity.TryGetStructure(out structure)) { Structure inStructure = structure.InternalData.structure; inStructure.health += (ushort)num.Internal; ushort max = ((ItemStructureAsset)Assets.find(EAssetType.ITEM, inStructure.id)).health; if (inStructure.health > max) { inStructure.health = max; } if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed a structure to a new health value of " + inStructure.health + "!"); } return; } VehicleTag vehicle; if (entity.TryGetVehicle(out vehicle)) { vehicle.Internal.askRepair((ushort)num.Internal); if (entry.ShouldShowGood(queue)) { entry.Good(queue, "Successfully healed a vehicle to a new health value of " + vehicle.Internal.health + "!"); } return; } queue.HandleError(entry, "That entity can't be healed!"); } catch (Exception ex) // TODO: Necessity? { queue.HandleError(entry, ("Failed to heal entity: " + ex.ToString())); } }