aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/re/jag/parquet/commands/CameraMode.java
blob: 60f61be279eac4a2cbe49679381d74628604ddb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package re.jag.parquet.commands;

import static net.minecraft.server.command.CommandManager.argument;
import static net.minecraft.server.command.CommandManager.literal;

import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;

import net.minecraft.command.argument.EntityArgumentType;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket;
import net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.LiteralText;
import net.minecraft.world.GameMode;
import re.jag.parquet.Parquet;
import re.jag.parquet.interfaces.CameraModeData;

public class CameraMode {
	public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
		/*
		 * If not used with fabric-carpet, /s and /c can be used.
		 */
		LiteralArgumentBuilder<ServerCommandSource> camermode = literal("x").
				executes((c) -> camera( c.getSource(), c.getSource().getPlayer())).
					then(argument("player", EntityArgumentType.player()).
						executes( (c) -> camera(c.getSource(), EntityArgumentType.getPlayer(c, "player"))));
		LiteralArgumentBuilder<ServerCommandSource> survivalmode = literal("a").
				executes((c) -> survival( c.getSource(), c.getSource().getPlayer())).
					then(argument("player", EntityArgumentType.player()).
						executes( (c) -> survival(c.getSource(), EntityArgumentType.getPlayer(c, "player"))));
		LiteralArgumentBuilder<ServerCommandSource> defaultmode = literal("d").
				executes((c) -> defmode( c.getSource(), c.getSource().getPlayer())).
					then(argument("player", EntityArgumentType.player()).
						executes( (c) -> defmode(c.getSource(), EntityArgumentType.getPlayer(c, "player"))));
		 
		dispatcher.register(camermode);
		dispatcher.register(survivalmode);
		dispatcher.register(defaultmode);
	}
	
	private static void add_status_effects(ServerPlayerEntity player) {
		
        player.addStatusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, 999999, 0, false, false));
        player.addStatusEffect(new StatusEffectInstance(StatusEffects.CONDUIT_POWER, 999999, 0, false, false));
	}
	
	private static void remove_status_effects(ServerPlayerEntity player) {
		player.networkHandler.sendPacket(new RemoveEntityStatusEffectS2CPacket(player.getEntityId(), StatusEffects.NIGHT_VISION));
        player.removeStatusEffect(StatusEffects.NIGHT_VISION);
        player.networkHandler.sendPacket(new RemoveEntityStatusEffectS2CPacket(player.getEntityId(), StatusEffects.CONDUIT_POWER));
        player.removeStatusEffect(StatusEffects.CONDUIT_POWER);
	}
	
	private static int camera(ServerCommandSource source, ServerPlayerEntity player) {
		if (! ((CameraModeData)player).saveCameraPosition() ) {
			//source.sendFeedback(new LiteralText("Reset location already exists"), false);
			Parquet.LOG.debug("x: Reset location already exists for " + player.getName());
		} else {
			add_status_effects(player);
		}
		
		player.setGameMode(GameMode.SPECTATOR);
        player.addVelocity(0,0.1,0);
        player.networkHandler.sendPacket(new EntityVelocityUpdateS2CPacket(player));
        
        return 1;
	}
	
	private static int survival(ServerCommandSource source, ServerPlayerEntity player) {
		if (! ((CameraModeData)player).restoreCameraPosition() ) {
			//source.sendFeedback(new LiteralText("No reset location stored"), false);
			Parquet.LOG.debug("a: No reset location for " + player.getName());
		} else {
			remove_status_effects(player);
		}
		
		player.setGameMode(GameMode.SURVIVAL);
        
		return 1;
	}
	
	//Reset to server default gamemode
	private static int defmode(ServerCommandSource source, ServerPlayerEntity player) {
		if (! ((CameraModeData)player).restoreCameraPosition() ) {
			//source.sendFeedback(new LiteralText("No reset location stored"), false);
			Parquet.LOG.debug("d: No reset location for " + player.getName());
		} else {
			remove_status_effects(player);
		}
		
		player.setGameMode( player.getServer().getDefaultGameMode() );

		return 1;
	}
}