Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
f52adfe
fixes / macros / personal commands ported
WolfoIsBestWolf Dec 23, 2025
0ea5623
probably finished
WolfoIsBestWolf Dec 28, 2025
ecc3766
send it
WolfoIsBestWolf Dec 30, 2025
3de7716
Update Lang.cs
WolfoIsBestWolf Dec 30, 2025
2a86899
Merge branch 'master' into master
WolfoIsBestWolf Dec 30, 2025
095edf4
set_crit & spawn_as permament1 default
WolfoIsBestWolf Dec 31, 2025
82e6e80
Merge branch 'master' of https://github.com/WolfoIsBestWolf/DebugToolkit
WolfoIsBestWolf Dec 31, 2025
1091413
Cleanup 1
WolfoIsBestWolf Dec 31, 2025
3d9beab
Update PlayerCommands.cs
WolfoIsBestWolf Dec 31, 2025
5edebd3
'give_buff' negative amount now just calls 'remove_buff'
WolfoIsBestWolf Dec 31, 2025
1867d7d
cleanse now a proper macro not rather duplicate code
WolfoIsBestWolf Dec 31, 2025
262dcb1
Update Buffs.cs
WolfoIsBestWolf Dec 31, 2025
1334a37
Cleanup 2.0
WolfoIsBestWolf Jan 1, 2026
4332549
empty spaces / unused diffs again
WolfoIsBestWolf Jan 1, 2026
21945d5
Fixed toggle_time not really working as it should if time_scale was a…
WolfoIsBestWolf Jan 3, 2026
6d824ec
Missed a type
WolfoIsBestWolf Jan 4, 2026
dd6328b
set_difficulty command
WolfoIsBestWolf Jan 9, 2026
8372c1c
Made the set_ stats 1 stat to not fill up help command.
WolfoIsBestWolf Jan 9, 2026
b0bd155
Removed 3 proposed commands due to redundancy.
WolfoIsBestWolf Jan 10, 2026
ee40a41
Small things
WolfoIsBestWolf Jan 16, 2026
f4fc38c
Buffs.TryParse Pinged fail message fix for real
WolfoIsBestWolf Jan 16, 2026
03c08d3
Update CHANGELOG.md
WolfoIsBestWolf Jan 17, 2026
eece426
give_all_items {itemTier}
WolfoIsBestWolf Jan 18, 2026
95d97ba
'give_drone' -> `spawn_minion`
WolfoIsBestWolf Jan 18, 2026
364caaa
Misc consistency of proposed changes
WolfoIsBestWolf Jan 18, 2026
c792d56
'spawn_portal' updated for DLC3
WolfoIsBestWolf Jan 18, 2026
7644540
Update Spawners.cs
WolfoIsBestWolf Jan 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 62 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,68 @@

## Changelog ##

### 3.22 ###
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a reminder that whatever changes to commands are made as a result of this review the changelog should be updated appropriately. Obviously leave this as a last thing and make sure to also update the readme.

* **3.22.0**

* Added commands:
* 'give_drone': Summons drone, specified amount and tier
* 'remove_all_drones': Removes all drones, leaving no bodies.
* 'kill_minions': Kills all minions, leaving dead drones.
* 'list_drone': List drone names and ids.

* 'set_ .. damage, attackspeed, health, regen, armor, movespeed' Sets the stat to the specified value, for the target, for that life; For clean testing.
* 'reset_stats' Undoes changes from 'set_..' commands.
* 'nocooldowns': disables your skill cooldowns

* 'list_pickups': List pickup names and ids.
* 'list_mods': Lists all loaded mods and if they are tagged as RequiredByAll. Useful to get internal names to check for.
* 'buddhaenemy', 'invulenemy': Buddha mode for all enemies, to make them unkillable.
* 'goto_boss': Teleports you to boss, teleporter or boss arenas on stage, (so you don't have to fly to Mithrix 100 times)
* 'hide_model': hides model, for screenshotting/recording.

* 'evolve_lemurian': Triggers Artifact of Devotion evolution.
* 'give_voidcoin': Gives Void Markers.
* 'no_interactables': Prevent interactables from spawning
* 'toggle_time' Toggles 'time_scale' between 0 and what it it was before.


* Added macro/short commands:
* 'dtscanner' -> 100 BoostEquipmentRechrage & Radar Scanner equip for easy map searching.
* 'dtdamage' -> x1000000 damage macro.
* 'dtpeace' -> 'kill_all' monsters & voids and 'no_enemies true'
* 'random_equip' macro for 'give_equip random'
* 'rich', -> Set money to 2 billion.
* 'poor' -> Set money to 0.
* 'hud': shorthand toggle for 'hud_enable'
* 'skill': shorthand for 'loadout_set_skill_variant self'
* 'skin': shorthand for 'loadout_set_skin_variant self'
* 'unlimited_junk': Toggle for 'junk_unlimited'
* 'cleanse': Alt for 'remove_all_buffs 0 & 1'

* Updated command functionality:
* Item commands can now grant/remove channeled items
* Item commands now mention you can type 1/2/3 instead of the name type.
* 'spawn_interactable' now also shows interactable names in auto complete.
* 'spawn_interactable' now accepts amount.
* 'spawn_as' now has second argument to permanently spawn as the new body. (Like prior to AC behaviour) //Default False
* 'create_pickup' now supports dropping drones & pickups.
* 'create_pickup' switched {search} and {permanent/temp} argument spots.
* 'give_equip -1' now removes your equipment.
* 'give_buff' now works with negative amount for removing.
* 'loadout_set_skill_variant' now accepts 'self'
* 'random_items' changed default value to not give Lunars & Voids.
* 'hurt' third optional argument to bypass armor&damage calculations.
* 'kill_all' no value given now kills Monster & Void teams.
* 'kill_all' second optional argument to bypass revives. (Does not bypass Godmode)
* 'true_kill' now bypasses godmode.


* Amount of spawned interactables/monsters/drones by commands capped at a 100 per command, to not crash the game if you mistype.
* Fixed 'god 0/1'/'buddha 0/1' not setting the toggle's state.
* Fixed 'loadout_set_skin_variant' crashing the game.
* Modded interactables should be spawnable from the start now.


### 3.21 ###

* **3.21.1**
* Fixed the cheat ConVars not getting unlocked.
* Also enabled the following Alloyed Collective ConVars: `bag_disable_breakout`, `bounce_velocity`, `junk_unlimited`
Expand Down
18 changes: 16 additions & 2 deletions Code/AutoCompletion/AutoCompleteManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,15 @@ internal static void RegisterAutoCompleteCommands()
parser.RegisterStaticVariable("artifact", ArtifactCatalog.artifactDefs.Select(i => $"{(int)i.artifactIndex}|{i.cachedName}|{StringFinder.GetLangInvar(i.nameToken)}"), 1);
parser.RegisterStaticVariable("body", BodyCatalog.allBodyPrefabBodyBodyComponents.Select(i => $"{(int)i.bodyIndex}|{i.name}|{StringFinder.GetLangInvar(i.baseNameToken)}"), 1);
parser.RegisterStaticVariable("buff", BuffCatalog.buffDefs.Select(i => $"{(int)i.buffIndex}|{StringFinder.GetLangInvar(i.name)}"), 1);
parser.RegisterStaticVariable("droptable", ItemTierCatalog.allItemTierDefs.OrderBy(i => i.tier).Select(i => $"{(int)i.tier}|{i.name}"), 1);
parser.RegisterStaticVariable("tier", ItemTierCatalog.allItemTierDefs.OrderBy(i => i.tier).Select(i => $"{(int)i.tier}|{i.name}"), 1);
Comment thread
WolfoIsBestWolf marked this conversation as resolved.
Outdated
parser.RegisterStaticVariable("dot", DotController.dotDefs.Select((d, i) => $"{i}|{(DotController.DotIndex)i}"), 1);
parser.RegisterStaticVariable("elite", new string[] { "-1|None" }.
Concat(EliteCatalog.eliteDefs.Select(i => $"{(int)i.eliteIndex}|{i.name}|{StringFinder.GetLangInvar(i.modifierToken)}")),
1
);
parser.RegisterStaticVariable("equip", EquipmentCatalog.equipmentDefs.Select(i => $"{(int)i.equipmentIndex}|{i.name}|{StringFinder.GetLangInvar(i.nameToken)}"), 1);
parser.RegisterStaticVariable("item", ItemCatalog.allItemDefs.Select(i => $"{(int)i.itemIndex}|{i.name}|{StringFinder.GetLangInvar(i.nameToken)}"), 1);
parser.RegisterStaticVariable("drone", DroneCatalog.allDroneDefs.Select(i => $"{(int)i.droneIndex}|{i.name}|{StringFinder.GetLangInvar(i.nameToken)}"), 1);
parser.RegisterStaticVariable("specific_stage", SceneCatalog.allSceneDefs.Where(i => !i.isOfflineScene).Select(i => $"{(int)i.sceneDefIndex}|{i.cachedName}|{StringFinder.GetLangInvar(i.nameToken)}"), 1);
parser.RegisterStaticVariable("team", new string[] { "-1|None" }.
Concat(TeamCatalog.teamDefs.Select((t, i) => $"{i}|{(TeamIndex)i}")),
Expand All @@ -90,9 +91,22 @@ internal static void RegisterAutoCompleteCommands()
parser.RegisterStaticVariable("permission_level", CollectEnumNames(typeof(Permissions.Level), typeof(int)), 1);

parser.RegisterDynamicVariable("director_card", StringFinder.Instance.DirectorCards, "spawnCard", autocompleteIndex: 1);
Comment thread
WolfoIsBestWolf marked this conversation as resolved.
Outdated
parser.RegisterDynamicVariable("interactable", StringFinder.Instance.InteractableSpawnCards, autocompleteIndex: 1);
//parser.RegisterDynamicVariable("interactable", StringFinder.Instance.InteractableSpawnCards, autocompleteIndex: 1);
Comment thread
WolfoIsBestWolf marked this conversation as resolved.
Outdated
parser.RegisterDynamicVariable("interactable", StringFinder.Instance.InteractableSpawnCards.Select(i => $"{StringFinder.Instance.InteractableSpawnCards.IndexOf(i)}|{i.name}|{StringFinder.GetLangInvar(i.prefab?.GetComponent<IDisplayNameProvider>()?.GetDisplayName())}"), autocompleteIndex: 1);
Comment thread
WolfoIsBestWolf marked this conversation as resolved.
Outdated

parser.RegisterDynamicVariable("player", NetworkUser.instancesList, "userName");

parser.RegisterStaticVariable("itemTypes", new string[] {
"1|Permanent",
"2|Temp",
"3|Channelled",
},1
);
parser.RegisterStaticVariable("itemTypesNoChanneled", new string[] {
"1|Permanent",
"2|Temp",
}, 1
);
Comment thread
WolfoIsBestWolf marked this conversation as resolved.
Outdated
parser.Scan(System.Reflection.Assembly.GetExecutingAssembly());
}

Expand Down
91 changes: 73 additions & 18 deletions Code/DT-Commands/Buffs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,8 @@ private static void CCGiveBuff(ConCommandArgs args)
Log.MessageNetworked(String.Format(Lang.PARSE_ERROR, "count", "int"), args, LogLevel.MessageClientOnly);
return;
}
if (iCount < 0)
{
Log.MessageNetworked(String.Format(Lang.NEGATIVE_ARG, "count"), args, LogLevel.MessageClientOnly);
return;
}

bool remove = iCount < 0;

float duration = 0f;
if (args.Count > 2 && args[2] != Lang.DEFAULT_VALUE && !TextSerialization.TryParseInvariant(args[2], out duration))
{
Expand All @@ -102,8 +98,9 @@ private static void CCGiveBuff(ConCommandArgs args)
}
if (duration < 0f)
{
duration = 0;
Log.MessageNetworked(String.Format(Lang.NEGATIVE_ARG, "duration"), args, LogLevel.MessageClientOnly);
return;
//return;
}

var target = ParseTarget(args, 3);
Expand All @@ -126,28 +123,48 @@ private static void CCGiveBuff(ConCommandArgs args)
var canStack = BuffCatalog.GetBuffDef(buff).canStack;
var body = target.body;
if (duration == 0f)
{
if (!canStack)
{
if (remove)
{
iCount = Math.Min(iCount, 1 - body.GetBuffCount(buff));
for (int i = 0; i > iCount; i--)
{
body.RemoveBuff(buff);
}
}
for (int i = 0; i < iCount; i++)
else
{
body.AddBuff(buff);
if (!canStack)
{
iCount = Math.Min(iCount, 1 - body.GetBuffCount(buff));
}
for (int i = 0; i < iCount; i++)
{
body.AddBuff(buff);
}
}
Log.MessageNetworked(string.Format(Lang.GIVEOBJECT, iCount, name, target.name), args);
Log.MessageNetworked(string.Format(Lang.GIVEBUFF, iCount, name, target.name, ""), args);
}
else
{
if (!canStack)
if (remove)
{
iCount = Math.Min(iCount, 1);
for (int i = 0; i > iCount; i--)
{
body.RemoveOldestTimedBuff(buff);
}
}
for (int i = 0; i < iCount; i++)
else
{
body.AddTimedBuff(buff, duration);
if (!canStack)
{
iCount = Math.Min(iCount, 1);
}
for (int i = 0; i < iCount; i++)
{
body.AddTimedBuff(buff, duration);
}
}
Log.MessageNetworked($"Gave {iCount} {name} to {target.name} for {duration} seconds", args);
Log.MessageNetworked($"Gave {iCount} {name} to {target.name} for <color=#53E9FF>{duration} seconds</color>", args);
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should avoid colors in logs as much as possible. The main reason I've used green/red for enabled/disabled is because for toggle commands it's very easy to not notice if you're toggling it to the wrong value.

}
}

Expand Down Expand Up @@ -293,6 +310,44 @@ private static void CCRemoveBuffStacks(ConCommandArgs args)
}
}


[ConCommand(commandName = "cleanse", flags = ConVarFlags.ExecuteOnServer, helpText = Lang.REMOVEALLBUFFS_HELP)]
private static void CCCleanse(ConCommandArgs args)
{
if (!Run.instance)
{
Log.MessageNetworked(Lang.NOTINARUN_ERROR, args, LogLevel.MessageClientOnly);
return;
}
bool isDedicatedServer = args.sender == null;
if (isDedicatedServer && (args.Count < 1 || args[0] == Lang.DEFAULT_VALUE))
{
Log.MessageNetworked(Lang.INSUFFICIENT_ARGS + Lang.REMOVEALLBUFFS_ARGS, args, LogLevel.MessageClientOnly);
return;
}


var target = ParseTarget(args, 1);
if (target.failMessage != null)
{
Log.MessageNetworked(target.failMessage, args, LogLevel.MessageClientOnly);
return;
}

var body = target.body;
if (!body)
{
Log.MessageNetworked(target.failMessage, args, LogLevel.MessageClientOnly);
return;
}
CleanseSystem.CleanseBodyServer(body, true, true, true, true, true, false);
for (int i = 0; i < BuffCatalog.buffCount; i++)
{
body.SetBuffCount((BuffIndex)i, 0);
}
Log.MessageNetworked($"Cleansed {target.name} of all buffs.", args);
}

[ConCommand(commandName = "remove_all_buffs", flags = ConVarFlags.ExecuteOnServer, helpText = Lang.REMOVEALLBUFFS_HELP)]
[AutoComplete(Lang.REMOVEALLBUFFS_ARGS)]
private static void CCRemoveAllBuffs(ConCommandArgs args)
Expand Down
Loading