summaryrefslogtreecommitdiff
path: root/src/main/java/com/redstoner/modules/worldborder/WorldBorder.java
blob: c8da4c392afdd7df450c083020d807233fd49cc2 (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
package com.redstoner.modules.worldborder;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.vehicle.VehicleMoveEvent;
import org.json.simple.JSONObject;

import com.nemez.cmdmgr.Command;
import com.redstoner.annotations.AutoRegisterListener;
import com.redstoner.annotations.Commands;
import com.redstoner.annotations.Version;
import com.redstoner.misc.CommandHolderType;
import com.redstoner.misc.JsonManager;
import com.redstoner.misc.Main;
import com.redstoner.modules.Module;

import net.nemez.chatapi.ChatAPI;

@AutoRegisterListener
@Commands(CommandHolderType.File)
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class WorldBorder implements Module, Listener {
	
	Map<String, WorldBorderInfo> borderInfos = new HashMap<>();
	
	@Command(hook = "getwb")
	public void getWorldBorder(CommandSender sender, String world) {
		if (Bukkit.getWorld(world) == null) {
			getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist.");
			return;
		}
		
		WorldBorderInfo info = borderInfos.get(world);
		if (info == null)
			getLogger().message(sender, true, "The world, &e" + world +"&7, hasn't been configured yet.");
		else
			getLogger().message(sender, "&e" + world + "&7's World Border is " + info.getMessage());
	}
	
	@Command(hook = "setwb")
	public void setWorldBorder(CommandSender sender, String world, int cx, int cz, int r) {
		if (Bukkit.getWorld(world) == null) {
			getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist.");
			return;
		}
		
		WorldBorderInfo info = new WorldBorderInfo(cx, cz, r);
		borderInfos.put(world, info);
		save();
		getLogger().message(sender, "World Border for &e" + world + "&7 is now " + info.getMessage());
	}
	
	@Command(hook = "remwb")
	public void removeWorldBorder(CommandSender sender, String world) {
		if (Bukkit.getWorld(world) == null) {
			getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist.");
			return;
		}
		
		WorldBorderInfo info = borderInfos.remove(world);
		if (info == null) {
			getLogger().message(sender, true, "The world, &e" + world +"&7, hasn't been configured yet.");
			return;
		}
		save();
		getLogger().message(sender, "World Border for &e" + world + "&7 has been removed.");
	}
	
	@SuppressWarnings("unchecked")
	private void save() {
		File file = new File(Main.plugin.getDataFolder(), "WorldBorder.json");
		JSONObject j = new JSONObject();
		
		for(String world : borderInfos.keySet())
			j.put(world, borderInfos.get(world).toJSONObject());
		JsonManager.save(j, file);
	}
	
	@SuppressWarnings("unchecked")
	public void postEnable() {
		File file = new File(Main.plugin.getDataFolder(), "WorldBorder.json");
		
		if (!file.exists()) {
			JSONObject j = new JSONObject();
			j.put("placeholder", new WorldBorderInfo(0, 0, 0).toJSONObject());
			JsonManager.save(j, file);
			return;
		}
		
		JSONObject j = JsonManager.getObject(file);
		
		if (j.get("placeholder") != null) {
			j.remove("placeholder");
			getLogger().warn("Detected placeholder in config, ignoring!");
		}
		
		for (Object o : j.keySet()) {
			String world = (String) o;
			WorldBorderInfo info = WorldBorderInfo.fromJSONObject((JSONObject) j.get(world));
			borderInfos.put(world, info);
			getLogger().info("Loaded world, &e" + world + "&7, with the boarder " + info.getMessage());
		}
	}
	
	
	@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
	public void onBlockPlace(BlockPlaceEvent event) {
		
		Location loc = event.getBlockPlaced().getLocation();
		if (loc == null)
			return;
	
		World world = loc.getWorld();
		if (world == null)
			return;
		WorldBorderInfo info = borderInfos.get(world.getName());
		if (info == null)
			return;
		
		if (!info.isCordanateWithinBounds(loc.getBlockX(), loc.getBlockZ())) 
			event.setCancelled(true);
	}

	@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
	public void onVehicleMove(VehicleMoveEvent event) {
		Location to = event.getTo();
		WorldBorderInfo info = borderInfos.get(to.getWorld().getName());
		if (!info.isCordanateWithinBounds(to.getBlockX(), to.getBlockZ()))
			event.getVehicle().remove();
	}
	
	@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
	public void onPlayerMove(PlayerMoveEvent event) {
		
		Player p = event.getPlayer();
		
		Location loc = getFinalLocation(p, event.getFrom(),
                event.getTo(), "&cYou've Reached the WorldBorder!");
		if (loc == null)
			event.setCancelled(true);
		else
			event.setTo(loc);
	}
	
	@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
	public void onPlayerTeleport(PlayerTeleportEvent event) {
		Location loc = getFinalLocation(event.getPlayer(), event.getFrom(),
				                        event.getTo(), "&cYou've Teleported to an Invalid Location, returning!");
		if (loc == null)
			event.setCancelled(true);
		else
			event.setTo(loc);
	}
	
	@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
	public void onPlayerPortal(PlayerPortalEvent event) {
		Location loc = getFinalLocation(event.getPlayer(), event.getFrom(),
                event.getTo(), "&cYou've Reached an Invalid Location, returning!");
		if (loc == null)
			event.setCancelled(true);
		else
			event.setTo(loc);
	}
	
	
	private Location getFinalLocation(Player p, Location from, Location to, String message) {
		WorldBorderInfo info = borderInfos.get(to.getWorld().getName());
		
		if (info == null || info.isCordanateWithinBounds(to.getBlockX(), to.getBlockZ()))
			return to;
		else {
			System.out.println(p.isInsideVehicle());
			if (p.isInsideVehicle())
				p.getVehicle().remove();
			ChatAPI.sendActionBar(p, message);
			return from;
		}
	}
}