Skip to content

Commit fa66d87

Browse files
Added Firemode Unlocking, /UnlimitedAmmo, /SetAttachment, and added option to disable easily abusable commands.
1 parent 9abffe7 commit fa66d87

File tree

10 files changed

+450
-12
lines changed

10 files changed

+450
-12
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using Rocket.Unturned.Player;
2+
using SDG.Unturned;
3+
using UnityEngine;
4+
5+
namespace ShimmysAdminTools.Behaviors
6+
{
7+
public class FiremodeUnlocker : MonoBehaviour
8+
{
9+
public Player Player;
10+
11+
private bool awake = false;
12+
public bool Ready { get; private set; } = false;
13+
14+
private byte LastFireMode = 0;
15+
private bool SetStateNextUpdate = true;
16+
17+
public void SetPlayer(Player Player)
18+
{
19+
this.Player = Player;
20+
Ready = true;
21+
}
22+
23+
public void Awake()
24+
{
25+
awake = true;
26+
if (GetComponentInParent<Player>() != null)
27+
{
28+
Player = GetComponentInParent<Player>();
29+
Ready = true;
30+
}
31+
}
32+
public void FixedUpdate()
33+
{
34+
if (awake && Ready)
35+
{
36+
if (Player.equipment.asset == null || Player.equipment.asset.type != EItemType.GUN || Player.equipment.state == null || Player.equipment.state.Length < 10)
37+
{
38+
return;
39+
}
40+
41+
if (!Player.equipment.isEquipped)
42+
{
43+
SetStateNextUpdate = true;
44+
return;
45+
}
46+
47+
byte CurrentFireMode = Player.equipment.state[11];
48+
if (SetStateNextUpdate)
49+
{
50+
LastFireMode = CurrentFireMode;
51+
SetStateNextUpdate = false;
52+
}
53+
54+
if (CurrentFireMode != LastFireMode)
55+
{
56+
OnFiremodeChanged(LastFireMode, CurrentFireMode, out byte NewFireMode);
57+
LastFireMode = NewFireMode;
58+
}
59+
}
60+
}
61+
62+
public void OnFiremodeChanged(byte LastFireMode, byte NewFireMode, out byte SetFireMode)
63+
{
64+
SetFireMode = NewFireMode;
65+
byte NextFireMode = GetNextFireMode(LastFireMode);
66+
if (NextFireMode == NewFireMode)
67+
{
68+
return;
69+
};
70+
SetFireMode = NewFireMode;
71+
SendFireMode(NextFireMode);
72+
}
73+
74+
private byte GetNextFireMode(byte FireMode)
75+
{
76+
if (FireMode >= 3) return 0;
77+
return (byte)(FireMode + 1);
78+
}
79+
80+
public void SendFireMode(byte FireMode)
81+
{
82+
if (Player.equipment.state == null || Player.equipment.state.Length < 10) return;
83+
Player.equipment.state[11] = FireMode;
84+
SetStateNextUpdate = true;
85+
Player.equipment.sendUpdateState();
86+
}
87+
88+
public void Stop()
89+
{
90+
awake = false;
91+
}
92+
93+
public void OnDestroy()
94+
{
95+
Stop();
96+
}
97+
}
98+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
using SDG.Unturned;
2+
using UnityEngine;
3+
4+
namespace ShimmysAdminTools.Behaviors
5+
{
6+
public class UnlimitedAmmoBehaviour : MonoBehaviour
7+
{
8+
public Player Player;
9+
private bool awake = false;
10+
public bool Ready { get; protected set; } = false;
11+
12+
public byte AmountOverride = 255;
13+
public bool AmountOverrideEnabled = false;
14+
15+
public void Awake()
16+
{
17+
awake = true;
18+
Player ParentPlayer = GetComponentInParent<Player>();
19+
if (ParentPlayer != null)
20+
{
21+
Ready = true;
22+
Player = ParentPlayer;
23+
}
24+
}
25+
26+
private void FixedUpdate()
27+
{
28+
if (awake && Ready)
29+
{
30+
if (Player.equipment.asset == null || Player.equipment.asset.type != EItemType.GUN || Player.equipment.state == null || Player.equipment.state.Length < 10)
31+
{
32+
return;
33+
}
34+
byte Ammo = Player.equipment.state[10];
35+
if (AmountOverrideEnabled)
36+
{
37+
if (Ammo != 255)
38+
{
39+
SendAmmo(AmountOverride);
40+
}
41+
}
42+
else
43+
{
44+
if (Player.equipment.asset is ItemGunAsset)
45+
{
46+
ItemGunAsset Gun = (ItemGunAsset)Player.equipment.asset;
47+
if (Ammo < Gun.ammoMax)
48+
{
49+
SendAmmo(Gun.ammoMax);
50+
}
51+
}
52+
else if (Ammo < Player.equipment.asset.countMax)
53+
{
54+
SendAmmo(Player.equipment.asset.countMax);
55+
}
56+
}
57+
}
58+
}
59+
60+
public void SendAmmo(byte Ammo)
61+
{
62+
Player.equipment.state[10] = Ammo;
63+
Player.equipment.sendUpdateState();
64+
}
65+
66+
public void Stop()
67+
{
68+
awake = false;
69+
}
70+
71+
private void OnDestroy()
72+
{
73+
Stop();
74+
}
75+
}
76+
}

ShimmysAdminTools/Commands/MapJumpCommand.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
1+
using System.Collections.Generic;
62
using Rocket.API;
73
using Rocket.Unturned.Chat;
84
using Rocket.Unturned.Player;
95
using ShimmysAdminTools.Components;
106
using ShimmysAdminTools.Models;
117
using ShimmysAdminTools.Modules;
12-
using UnityEngine;
138

149
namespace ShimmysAdminTools.Commands
1510
{
@@ -29,17 +24,23 @@ public class MapJumpCommand : IRocketCommand
2924

3025
public void Execute(IRocketPlayer caller, string[] command)
3126
{
27+
if (main.Config.DisableAbusableCommands)
28+
{
29+
UnturnedChat.Say(caller, "Fail_Command_Disabled".Translate());
30+
return;
31+
}
3232
PlayerSession session = PlayerSessionStore.GetPlayerData((UnturnedPlayer)caller);
3333

3434
if (session.MapJumpingSession == null)
3535
{
3636
session.StartMapJumpingSession();
3737
UnturnedChat.Say(caller, "MapJump_Enabled".Translate());
38-
} else
38+
}
39+
else
3940
{
4041
session.StopMapJumpingSession();
4142
UnturnedChat.Say(caller, "MapJump_Disabled".Translate());
4243
}
4344
}
4445
}
45-
}
46+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Rocket.API;
5+
using Rocket.Unturned.Chat;
6+
using Rocket.Unturned.Player;
7+
using SDG.Unturned;
8+
using ShimmysAdminTools.Components;
9+
10+
namespace ShimmysAdminTools.Commands
11+
{
12+
public class SetAttachmentCommand : IRocketCommand
13+
{
14+
readonly static EItemType[] Types = new EItemType[] { EItemType.BARREL, EItemType.GRIP, EItemType.MAGAZINE, EItemType.SIGHT, EItemType.TACTICAL };
15+
public AllowedCaller AllowedCaller => AllowedCaller.Player;
16+
17+
public string Name => "SetAttachment";
18+
19+
public string Help => "Forcibly gives your gun an attachment or magazine.";
20+
21+
public string Syntax => "SetAttachment [Attachment Name/ID]";
22+
23+
public List<string> Aliases => new List<string>() { "Attachment", "Att" };
24+
25+
public List<string> Permissions => new List<string>() { "ShimmysAdminTools.SetAttachment" };
26+
27+
public void Execute(IRocketPlayer caller, string[] command)
28+
{
29+
if (main.Config.DisableAbusableCommands)
30+
{
31+
UnturnedChat.Say(caller, "Fail_Command_Disabled".Translate());
32+
return;
33+
}
34+
UnturnedPlayer Player = (UnturnedPlayer)caller;
35+
if (command.Length > 0)
36+
{
37+
if (Player.Player.equipment.state == null || Player.Player.equipment.state.Length < 12 || Player.Player.equipment.asset == null || Player.Player.equipment.asset.type != EItemType.GUN)
38+
{
39+
UnturnedChat.Say(caller, "SetAttachment_Fail_Gun".Translate());
40+
return;
41+
}
42+
43+
ItemAsset Item = null;
44+
45+
if (ushort.TryParse(command[0], out ushort ItemID))
46+
{
47+
Asset SelectAsset = Assets.find(EAssetType.ITEM, ItemID);
48+
if (SelectAsset != null && typeof(ItemAsset).IsAssignableFrom(SelectAsset.GetType()) && Types.Contains(((ItemAsset)SelectAsset).type))
49+
{
50+
Item = (ItemAsset)SelectAsset;
51+
}
52+
}
53+
54+
if (Item == null)
55+
{
56+
ItemAsset[] Ast = Assets.find(EAssetType.ITEM).Where(x => typeof(ItemAsset).IsAssignableFrom(x.GetType()) &&
57+
Types.Contains(((ItemAsset)x).type) &&
58+
((ItemAsset)x).itemName.ToLower().Contains(command[0].ToLower()))
59+
.Cast<ItemAsset>()
60+
.ToArray();
61+
if (Ast.Length != 0) Item = Ast[0];
62+
}
63+
64+
if (Item != null)
65+
{
66+
if (main.Config.BlacklistedAttachments.Contains(Item.id))
67+
{
68+
UnturnedChat.Say(caller, "SetAttachment_Fail_Blacklist".Translate());
69+
return;
70+
}
71+
72+
byte pos = 255;
73+
if (Item.type == EItemType.SIGHT)
74+
{
75+
pos = 0;
76+
}
77+
else if (Item.type == EItemType.TACTICAL)
78+
{
79+
pos = 2;
80+
}
81+
else if (Item.type == EItemType.GRIP)
82+
{
83+
pos = 4;
84+
}
85+
else if (Item.type == EItemType.BARREL)
86+
{
87+
pos = 6;
88+
}
89+
else if (Item.type == EItemType.MAGAZINE)
90+
{
91+
pos = 8;
92+
}
93+
if (pos == 255) return;
94+
byte[] ID = BitConverter.GetBytes(Item.id);
95+
Array.Copy(ID, 0, Player.Player.equipment.state, pos, 2);
96+
Player.Player.equipment.sendUpdateState();
97+
UnturnedChat.Say(caller, "SetAttachment_GaveAttachment".Translate(Item.itemName));
98+
}
99+
else
100+
{
101+
UnturnedChat.Say(caller, "SetAttachment_Fail_Item".Translate());
102+
}
103+
}
104+
else
105+
{
106+
UnturnedChat.Say(caller, Syntax);
107+
}
108+
}
109+
}
110+
}

ShimmysAdminTools/Commands/SetFiremodeCommand.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ public class SetFiremodeCommand : IRocketCommand
2424

2525
public void Execute(IRocketPlayer caller, string[] command)
2626
{
27+
if (main.Config.DisableAbusableCommands)
28+
{
29+
UnturnedChat.Say(caller, "Fail_Command_Disabled".Translate());
30+
return;
31+
}
2732
UnturnedPlayer Player = (UnturnedPlayer)caller;
2833

2934
if (command.Length > 0)

0 commit comments

Comments
 (0)