Skip to content

Commit 7e6894e

Browse files
committed
send resources
1 parent 2fdeb19 commit 7e6894e

File tree

13 files changed

+305
-20
lines changed

13 files changed

+305
-20
lines changed

TODO.txt

+3-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ Bugfixes
2828
[❌] groundYlevel not working if you're already below it?
2929
[❌] gui scale not working?
3030

31-
3231
[❌] Recreate tutorial world in 1.20.1
3332
[🟡] tutorial camera centering is off
3433
[🟡] Mounted piglins don't heal from nether terrain
@@ -39,9 +38,9 @@ Quality of Life
3938
[❌] Add commands to send resources
4039
[❌] Ravagers that are mounted no longer aggro automatically onto buildings
4140
- This prevents them hurting themselves from the splash damage
42-
[] Button to toggle spider climbing
43-
[] Slimes and magma cubes no longer clip into log blocks, but are just slowed down
44-
[] Turn cheats on by default for sandbox mode
41+
[🟡] Button to toggle spider climbing
42+
[🟡] Slimes and magma cubes no longer clip into log blocks, but are just slowed down
43+
[] Turn cheats on by default for sandbox mode
4544

4645

4746

src/main/java/com/solegendary/reignofnether/ability/HeroAbility.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.solegendary.reignofnether.keybinds.Keybindings;
88
import com.solegendary.reignofnether.unit.UnitAction;
99
import com.solegendary.reignofnether.unit.interfaces.HeroUnit;
10+
import com.solegendary.reignofnether.unit.interfaces.Unit;
1011
import net.minecraft.client.resources.language.I18n;
1112
import net.minecraft.network.chat.Style;
1213
import net.minecraft.resources.ResourceLocation;
@@ -81,7 +82,7 @@ protected Button getRankUpButtonProtected(String name, ResourceLocation resource
8182
() -> {
8283
if (rankUp()) {
8384
AbilityServerboundPacket.rankUpAbility(((Entity) hero).getId(), action);
84-
hero.updateAbilityButtons();
85+
((Unit) hero).updateAbilityButtons();
8586
}
8687
if (hero.getSkillPoints() <= 0)
8788
hero.showRankUpMenu(false);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.solegendary.reignofnether.ability.abilities;
2+
3+
import com.solegendary.reignofnether.ReignOfNether;
4+
import com.solegendary.reignofnether.ability.Ability;
5+
import com.solegendary.reignofnether.hud.AbilityButton;
6+
import com.solegendary.reignofnether.keybinds.Keybinding;
7+
import com.solegendary.reignofnether.research.ResearchClient;
8+
import com.solegendary.reignofnether.research.researchItems.ResearchBloodlust;
9+
import com.solegendary.reignofnether.resources.ResourceCost;
10+
import com.solegendary.reignofnether.unit.UnitAction;
11+
import com.solegendary.reignofnether.unit.UnitClientEvents;
12+
import com.solegendary.reignofnether.unit.interfaces.Unit;
13+
import com.solegendary.reignofnether.unit.units.monsters.SpiderUnit;
14+
import com.solegendary.reignofnether.unit.units.piglins.BruteUnit;
15+
import com.solegendary.reignofnether.unit.units.piglins.HeadhunterUnit;
16+
import net.minecraft.client.resources.language.I18n;
17+
import net.minecraft.core.BlockPos;
18+
import net.minecraft.resources.ResourceLocation;
19+
import net.minecraft.world.effect.MobEffectInstance;
20+
import net.minecraft.world.effect.MobEffects;
21+
import net.minecraft.world.entity.LivingEntity;
22+
import net.minecraft.world.level.Level;
23+
24+
import java.util.List;
25+
26+
import static com.solegendary.reignofnether.util.MiscUtil.fcs;
27+
28+
public class SpiderClimbing extends Ability {
29+
30+
private final SpiderUnit unit;
31+
32+
public SpiderClimbing(SpiderUnit unit) {
33+
super(
34+
UnitAction.TOGGLE_SPIDER_CLIMBING,
35+
unit.level(),
36+
0,
37+
0,
38+
0,
39+
false,
40+
false
41+
);
42+
this.unit = unit;
43+
}
44+
45+
@Override
46+
public AbilityButton getButton(Keybinding hotkey) {
47+
ResourceLocation rlLadder = new ResourceLocation("minecraft", "textures/block/ladder.png");
48+
ResourceLocation rlBarrier = new ResourceLocation(ReignOfNether.MOD_ID, "textures/icons/items/barrier.png");
49+
50+
AbilityButton ab = new AbilityButton(
51+
"Toggle Wall Climbing",
52+
unit.isWallClimbing() ? rlLadder : rlBarrier,
53+
hotkey,
54+
() -> false,
55+
() -> false,
56+
() -> true,
57+
() -> UnitClientEvents.sendUnitCommand(UnitAction.TOGGLE_SPIDER_CLIMBING),
58+
null,
59+
List.of(
60+
unit.isWallClimbing() ?
61+
fcs(I18n.get("abilities.reignofnether.spider_climbing_on")) :
62+
fcs(I18n.get("abilities.reignofnether.spider_climbing_off"))
63+
),
64+
this
65+
);
66+
if (!unit.isWallClimbing())
67+
ab.bgIconResource = rlLadder;
68+
69+
return ab;
70+
}
71+
72+
@Override
73+
public void use(Level level, Unit unitUsing, BlockPos targetBp) {
74+
if (unitUsing instanceof SpiderUnit spiderUnit)
75+
spiderUnit.toggleWallClimbing();
76+
if (level.isClientSide())
77+
unitUsing.updateAbilityButtons();
78+
}
79+
80+
@Override
81+
public boolean shouldResetBehaviours() { return false; }
82+
}

src/main/java/com/solegendary/reignofnether/player/PlayerClientEvents.java

+21
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.solegendary.reignofnether.player;
22

3+
import com.mojang.brigadier.arguments.IntegerArgumentType;
34
import com.solegendary.reignofnether.building.Building;
45
import com.solegendary.reignofnether.building.BuildingClientEvents;
56
import com.solegendary.reignofnether.fogofwar.FogOfWarClientEvents;
@@ -10,6 +11,7 @@
1011
import com.solegendary.reignofnether.orthoview.OrthoviewClientEvents;
1112
import com.solegendary.reignofnether.registrars.SoundRegistrar;
1213
import com.solegendary.reignofnether.research.ResearchClient;
14+
import com.solegendary.reignofnether.resources.ResourceName;
1315
import com.solegendary.reignofnether.resources.ResourcesClientEvents;
1416
import com.solegendary.reignofnether.sandbox.SandboxClientEvents;
1517
import com.solegendary.reignofnether.startpos.StartPosClientEvents;
@@ -20,8 +22,11 @@
2022
import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen;
2123
import net.minecraft.client.gui.screens.inventory.InventoryScreen;
2224
import net.minecraft.commands.Commands;
25+
import net.minecraft.commands.arguments.EntityArgument;
2326
import net.minecraft.network.chat.Component;
27+
import net.minecraft.server.level.ServerPlayer;
2428
import net.minecraft.world.entity.LivingEntity;
29+
import net.minecraft.world.entity.player.Player;
2530
import net.minecraftforge.client.event.ClientPlayerNetworkEvent;
2631
import net.minecraftforge.client.event.RegisterClientCommandsEvent;
2732
import net.minecraftforge.client.event.ScreenEvent;
@@ -44,6 +49,22 @@ public class PlayerClientEvents {
4449

4550
@SubscribeEvent
4651
public static void onRegisterCommand(RegisterClientCommandsEvent evt) {
52+
53+
evt.getDispatcher().register(Commands.literal("send-food")
54+
.then(Commands.argument("player", EntityArgument.player())
55+
.then(Commands.argument("amount", IntegerArgumentType.integer(0,Integer.MAX_VALUE))
56+
.executes((command) -> ResourcesClientEvents.trySendingResources(command, ResourceName.FOOD)))));
57+
58+
evt.getDispatcher().register(Commands.literal("send-wood")
59+
.then(Commands.argument("player", EntityArgument.player())
60+
.then(Commands.argument("amount", IntegerArgumentType.integer(0,Integer.MAX_VALUE))
61+
.executes((command) -> ResourcesClientEvents.trySendingResources(command, ResourceName.WOOD)))));
62+
63+
evt.getDispatcher().register(Commands.literal("send-ore")
64+
.then(Commands.argument("player", EntityArgument.player())
65+
.then(Commands.argument("amount", IntegerArgumentType.integer(0,Integer.MAX_VALUE))
66+
.executes((command) -> ResourcesClientEvents.trySendingResources(command, ResourceName.ORE)))));
67+
4768
evt.getDispatcher().register(Commands.literal("rts-camera").executes((command) -> {
4869
OrthoviewClientEvents.tryToToggleEnable();
4970
return 1;

src/main/java/com/solegendary/reignofnether/player/PlayerServerEvents.java

+30-6
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,8 @@ public static void startRTS(int playerId, Vec3 pos, Faction faction, boolean rea
388388
} else {
389389
level.setDayTime(MONSTER_START_TIME_OF_DAY);
390390
}
391+
} else {
392+
enableAllCheats(playerName);
391393
}
392394
ResourcesServerEvents.resetResources(playerName);
393395

@@ -573,17 +575,20 @@ public static void onPlayerChat(ServerChatEvent evt) {
573575
) {
574576
ResourcesServerEvents.addSubtractResources(new Resources(playerName, 99999, 99999, 99999));
575577
UnitServerEvents.maxPopulation = 99999;
576-
577-
for (String cheatName : singleWordCheats) {
578-
ResearchServerEvents.addCheat(playerName, cheatName);
579-
ResearchClientboundPacket.addCheat(playerName, cheatName);
580-
evt.setCanceled(true);
581-
}
578+
enableAllCheats(playerName);
579+
evt.setCanceled(true);
582580
sendMessageToAllPlayers("server.reignofnether.all_cheats", false, playerName);
583581
}
584582
}
585583
}
586584

585+
public static void enableAllCheats(String playerName) {
586+
for (String cheatName : singleWordCheats) {
587+
ResearchServerEvents.addCheat(playerName, cheatName);
588+
ResearchClientboundPacket.addCheat(playerName, cheatName);
589+
}
590+
}
591+
587592
public static void enableOrthoview(int id) {
588593
ServerPlayer player = getPlayerById(id);
589594
player.removeAllEffects();
@@ -685,6 +690,25 @@ public static void sendMessageToAllPlayersNoNewlines(String msg, boolean bold, O
685690
}
686691
}
687692

693+
public static void sendMessageToPlayer(String playerName, String msg) {
694+
sendMessageToPlayer(playerName, msg, false);
695+
}
696+
697+
public static void sendMessageToPlayer(String playerName, String msg, boolean bold, Object... formatArgs) {
698+
for (ServerPlayer player : players) {
699+
if (player.getName().getString().equals(playerName)) {
700+
player.sendSystemMessage(Component.literal(""));
701+
if (bold) {
702+
player.sendSystemMessage(Component.translatable(msg, formatArgs).withStyle(Style.EMPTY.withBold(true)));
703+
} else {
704+
player.sendSystemMessage(Component.translatable(msg, formatArgs));
705+
}
706+
player.sendSystemMessage(Component.literal(""));
707+
return;
708+
}
709+
}
710+
}
711+
688712
// defeat a player, giving them a defeat screen, removing all their unit/building control and removing them from
689713
// rtsPlayers
690714
public static void defeat(int playerId, String reason) {

src/main/java/com/solegendary/reignofnether/resources/ResourcesClientEvents.java

+39-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package com.solegendary.reignofnether.resources;
22

33
import com.mojang.blaze3d.vertex.PoseStack;
4+
import com.mojang.brigadier.arguments.IntegerArgumentType;
5+
import com.mojang.brigadier.context.CommandContext;
6+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
47
import com.mojang.math.Axis;
5-
import net.minecraft.network.chat.Style;
6-
import org.joml.Vector3f;
78
import com.solegendary.reignofnether.hud.HudClientEvents;
89
import com.solegendary.reignofnether.keybinds.Keybindings;
910
import com.solegendary.reignofnether.orthoview.OrthoviewClientEvents;
@@ -13,6 +14,8 @@
1314
import net.minecraft.client.Minecraft;
1415
import net.minecraft.client.gui.Font;
1516
import net.minecraft.client.resources.language.I18n;
17+
import net.minecraft.commands.CommandSourceStack;
18+
import net.minecraft.commands.arguments.EntityArgument;
1619
import net.minecraft.core.BlockPos;
1720
import net.minecraft.network.chat.Component;
1821
import net.minecraft.network.chat.MutableComponent;
@@ -87,7 +90,7 @@ public static void showWarning(String ownerName, String msg) {
8790
HudClientEvents.showTemporaryMessage(loc);
8891

8992
// remove checkpoints from a failed building placement since the client has no knowledge of resource costs
90-
if (loc.contains("You don't have enough")) {
93+
if (msg.contains("not_enough")) {
9194
for (LivingEntity entity : getSelectedUnits())
9295
if (entity instanceof Unit unit)
9396
if (((Entity) unit).level().isClientSide() && !Keybindings.shiftMod.isDown())
@@ -196,4 +199,37 @@ public static void onRenderLevel(RenderLevelStageEvent evt) {
196199
}
197200
floatingTexts.removeIf(t -> t.tickAge > FLOATING_TEXT_MAX_AGE);
198201
}
202+
203+
public static int trySendingResources(CommandContext<CommandSourceStack> context, ResourceName resourceName) throws CommandSyntaxException {
204+
Player thisPlayer = context.getSource().getPlayer();
205+
Player sendToPlayer = EntityArgument.getPlayer(context, "player");
206+
int amount = IntegerArgumentType.getInteger(context, "amount");
207+
208+
Resources res = getOwnResources();
209+
if (res == null || thisPlayer == null)
210+
return 0;
211+
212+
switch (resourceName) {
213+
case FOOD -> {
214+
if (res.food < amount) {
215+
thisPlayer.sendSystemMessage(Component.translatable(I18n.get("server.resources.reignofnether.not_enough_food")));
216+
return 0;
217+
}
218+
}
219+
case WOOD -> {
220+
if (res.wood < amount) {
221+
thisPlayer.sendSystemMessage(Component.translatable(I18n.get("server.resources.reignofnether.not_enough_food")));
222+
return 0;
223+
}
224+
}
225+
case ORE -> {
226+
if (res.ore < amount) {
227+
thisPlayer.sendSystemMessage(Component.translatable(I18n.get("server.resources.reignofnether.not_enough_food")));
228+
return 0;
229+
}
230+
}
231+
}
232+
ResourcesServerboundPacket.sendResources(thisPlayer.getName().getString(), sendToPlayer.getName().getString(), resourceName, amount);
233+
return 1;
234+
}
199235
}

src/main/java/com/solegendary/reignofnether/resources/ResourcesServerEvents.java

+27
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.solegendary.reignofnether.tutorial.TutorialServerEvents;
1111
import com.solegendary.reignofnether.unit.UnitServerEvents;
1212
import com.solegendary.reignofnether.unit.interfaces.Unit;
13+
import net.minecraft.client.resources.language.I18n;
1314
import net.minecraft.core.BlockPos;
1415
import net.minecraft.server.level.ServerLevel;
1516
import net.minecraft.world.entity.LivingEntity;
@@ -281,6 +282,32 @@ public static void fellAdjacentLogs(BlockPos bp, ArrayList<BlockPos> bpsExcluded
281282
}
282283
}
283284

285+
public static void trySendingResources(String playerGiving, String playerReceiving, ResourceName resourceName, int amount) {
286+
if (canAfford(playerGiving, resourceName, amount)) {
287+
addSubtractResources(new Resources(playerGiving,
288+
resourceName == ResourceName.FOOD ? amount : 0,
289+
resourceName == ResourceName.WOOD ? amount : 0,
290+
resourceName == ResourceName.ORE ? amount : 0
291+
));
292+
String resString = null;
293+
switch (resourceName) {
294+
case FOOD -> resString = I18n.get("resources.reignofnether.food");
295+
case WOOD -> resString = I18n.get("resources.reignofnether.wood");
296+
case ORE -> resString = I18n.get("resources.reignofnether.ore");
297+
}
298+
if (resString != null) {
299+
PlayerServerEvents.sendMessageToPlayer(playerGiving, I18n.get("server.resources.reignofnether.sent_resources", amount, resString, playerReceiving));
300+
PlayerServerEvents.sendMessageToPlayer(playerReceiving, I18n.get("server.resources.reignofnether.received_resources", amount, resString, playerGiving));
301+
}
302+
} else {
303+
ResourcesClientboundPacket.warnInsufficientResources(playerGiving,
304+
resourceName == ResourceName.FOOD,
305+
resourceName == ResourceName.WOOD,
306+
resourceName == ResourceName.ORE
307+
);
308+
}
309+
}
310+
284311
private static final Map<Block, Block> FALLING_LOGS = new HashMap<>();
285312
static {
286313
FALLING_LOGS.put(Blocks.OAK_LOG, BlockRegistrar.FALLING_OAK_LOG.get());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.solegendary.reignofnether.resources;
2+
3+
import com.solegendary.reignofnether.registrars.PacketHandler;
4+
import com.solegendary.reignofnether.research.ResearchClientboundPacket;
5+
import com.solegendary.reignofnether.research.ResearchServerEvents;
6+
import net.minecraft.network.FriendlyByteBuf;
7+
import net.minecraftforge.network.NetworkEvent;
8+
9+
import java.util.concurrent.atomic.AtomicBoolean;
10+
import java.util.function.Supplier;
11+
12+
public class ResourcesServerboundPacket {
13+
14+
public String playerGiving;
15+
public String playerReceiving;
16+
public ResourceName resourceName;
17+
public int amount;
18+
19+
public static void sendResources(String playerGiving, String playerReceiving, ResourceName resourceName, int amount) {
20+
PacketHandler.INSTANCE.sendToServer(new ResourcesServerboundPacket(playerGiving, playerReceiving, resourceName, amount));
21+
}
22+
23+
public ResourcesServerboundPacket(String playerGiving, String playerReceiving, ResourceName resourceName, int amount) {
24+
this.playerGiving = playerGiving;
25+
this.playerReceiving = playerReceiving;
26+
this.resourceName = resourceName;
27+
this.amount = amount;
28+
}
29+
30+
public ResourcesServerboundPacket(FriendlyByteBuf buffer) {
31+
this.playerGiving = buffer.readUtf();
32+
this.playerReceiving = buffer.readUtf();
33+
this.resourceName = buffer.readEnum(ResourceName.class);
34+
this.amount = buffer.readInt();
35+
}
36+
37+
public void encode(FriendlyByteBuf buffer) {
38+
buffer.writeUtf(this.playerGiving);
39+
buffer.writeUtf(this.playerReceiving);
40+
buffer.writeEnum(this.resourceName);
41+
buffer.writeInt(this.amount);
42+
}
43+
44+
// server-side packet-consuming functions
45+
public boolean handle(Supplier<NetworkEvent.Context> ctx) {
46+
final var success = new AtomicBoolean(false);
47+
ctx.get().enqueueWork(() -> {
48+
ResourcesServerEvents.trySendingResources(this.playerGiving, this.playerReceiving, this.resourceName, this.amount);
49+
success.set(true);
50+
});
51+
ctx.get().setPacketHandled(true);
52+
return success.get();
53+
}
54+
}

0 commit comments

Comments
 (0)