Skip to content

Commit fe10cb4

Browse files
authored
Attempt to fix dupe with portals.
1 parent 2d189a4 commit fe10cb4

File tree

5 files changed

+160
-23
lines changed

5 files changed

+160
-23
lines changed

src/main/java/mr_krab/dupefixer/DupeFixer.java

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import java.io.File;
1818
import java.io.IOException;
1919
import java.nio.file.Path;
20+
import java.util.ArrayList;
21+
import java.util.List;
2022

2123
import org.slf4j.Logger;
2224
import org.slf4j.LoggerFactory;
@@ -38,6 +40,7 @@
3840
import mr_krab.dupefixer.listeners.DropListener;
3941
import mr_krab.dupefixer.listeners.InteractItemListenerFluidFixGP;
4042
import mr_krab.dupefixer.listeners.InteractItemListenerFluidFixRP;
43+
import mr_krab.dupefixer.listeners.PortalListener;
4144
import mr_krab.dupefixer.listeners.ShiftClickListener;
4245
import mr_krab.dupefixer.utils.ConfigUtil;
4346
import mr_krab.dupefixer.utils.ProtectPluginsAPI;
@@ -46,7 +49,7 @@
4649

4750
@Plugin(id = "dupefixer",
4851
name = "DupeFixer",
49-
version = "1.2",
52+
version = "1.3",
5053
authors = "Mr_Krab",
5154
dependencies = {
5255
@Dependency(id = "griefprevention", optional = true),
@@ -71,8 +74,14 @@ public class DupeFixer {
7174
private static DupeFixer instance;
7275
private static ConfigUtil configUtil;
7376
private static ProtectPluginsAPI protectPluginsAPI;
77+
private static DropListener dropListener;
78+
private static InteractItemListenerFluidFixGP iGp;
79+
private static InteractItemListenerFluidFixRP iRp;
80+
private static PortalListener portalListener;
81+
private static ShiftClickListener shiftClickListener;
7482

7583
boolean foundRP = false;
84+
List<String> enableListeners = new ArrayList<String>();
7685

7786
public Path getConfigDir() {
7887
return configDir;
@@ -93,15 +102,6 @@ public ProtectPluginsAPI getProtectPluginsAPI() {
93102
return protectPluginsAPI;
94103
}
95104

96-
public void load() {
97-
configLoader = YAMLConfigurationLoader.builder().setPath(configDir.resolve("config.yml")).setFlowStyle(FlowStyle.BLOCK).build();
98-
try {
99-
rootNode = configLoader.load();
100-
} catch (IOException e) {
101-
e.printStackTrace();
102-
}
103-
}
104-
105105
@Listener
106106
public void onPostInitialization(GamePostInitializationEvent event) {
107107
logger = (Logger)LoggerFactory.getLogger("DupeFixer");
@@ -110,7 +110,7 @@ public void onPostInitialization(GamePostInitializationEvent event) {
110110
load();
111111
configUtil.checkConfigVersion();
112112
protectPluginsAPI = new ProtectPluginsAPI();
113-
registerListeners();
113+
updateListeners();
114114
}
115115

116116
@Listener
@@ -124,31 +124,85 @@ public void onCompleteLoadServer(GameStartedServerEvent event) {
124124
@Listener
125125
public void onReload(GameReloadEvent event) {
126126
load();
127+
updateListeners();
128+
}
129+
130+
public void load() {
131+
configLoader = YAMLConfigurationLoader.builder().setPath(configDir.resolve("config.yml")).setFlowStyle(FlowStyle.BLOCK).build();
132+
try {
133+
rootNode = configLoader.load();
134+
} catch (IOException e) {
135+
e.printStackTrace();
136+
}
127137
}
128138

129-
private void registerListeners() {
130-
if(rootNode.getNode("FixContainer", "Enable").getBoolean()) {
131-
Sponge.getEventManager().registerListeners(this, new DropListener(this));
139+
private void updateListeners() {
140+
if(rootNode.getNode("FixContainer", "Enable").getBoolean() && !enableListeners.contains("DropListener")) {
141+
dropListener = new DropListener(this);
142+
Sponge.getEventManager().registerListeners(this, dropListener);
143+
enableListeners.add("DropListener");
144+
} else {
145+
if(dropListener != null) {
146+
Sponge.getEventManager().unregisterListeners(dropListener);
147+
enableListeners.remove("DropListener");
148+
dropListener = null;
149+
}
132150
}
151+
133152
if(rootNode.getNode("FixFluidDupe", "Enable").getBoolean()) {
134-
if (Sponge.getPluginManager().isLoaded("griefprevention")) {
153+
iRp = new InteractItemListenerFluidFixRP(this);
154+
if (Sponge.getPluginManager().isLoaded("griefprevention") && !enableListeners.contains("InteractItemListenerFluidFixGP")) {
135155
protectPluginsAPI.setGriefPreventionAPI(GriefPrevention.getApi());
136-
Sponge.getEventManager().registerListeners(this,new InteractItemListenerFluidFixGP(this));
156+
iGp = new InteractItemListenerFluidFixGP(this);
157+
Sponge.getEventManager().registerListeners(this, iGp);
158+
enableListeners.add("InteractItemListenerFluidFixGP");
159+
} else {
160+
if(iGp != null) {
161+
Sponge.getEventManager().unregisterListeners(iGp);
162+
enableListeners.remove("InteractItemListenerFluidFixGP");
163+
iGp = null;
164+
}
137165
}
138166
/*
139167
* Руки оторвать бы разработчику RedProtect за то, как он предоставляет API своего плагина.
140168
* The RedProtect developer needs to tear off his hands for how he provides his plugin API.
141169
*/
142-
if(Sponge.getPluginManager().getPlugin("redprotect").isPresent()) {
170+
if(Sponge.getPluginManager().getPlugin("redprotect").isPresent() && !enableListeners.contains("InteractItemListenerFluidFixRP")) {
143171
foundRP = true;
144-
Sponge.getEventManager().registerListeners(this,new InteractItemListenerFluidFixRP(this));
172+
Sponge.getEventManager().registerListeners(this, iRp);
173+
enableListeners.add("InteractItemListenerFluidFixRP");
174+
} else {
175+
if(iRp != null) {
176+
Sponge.getEventManager().unregisterListeners(iRp);
177+
enableListeners.remove("InteractItemListenerFluidFixRP");
178+
iRp = null;
179+
}
145180
}
146181
if(!protectPluginsAPI.isPresentGP() && !foundRP) {
147182
logger.error("None of the supported claims protection plugins were found!");
148183
}
149184
}
150-
if(rootNode.getNode("BlockShiftClick", "Enable").getBoolean()) {
151-
Sponge.getEventManager().registerListeners(this, new ShiftClickListener(this));
185+
if(rootNode.getNode("BlockShiftClick", "Enable").getBoolean() && !enableListeners.contains("ShiftClickListener")) {
186+
shiftClickListener = new ShiftClickListener(this);
187+
Sponge.getEventManager().registerListeners(this, shiftClickListener);
188+
enableListeners.add("ShiftClickListener");
189+
} else {
190+
if(shiftClickListener != null) {
191+
Sponge.getEventManager().unregisterListeners(shiftClickListener);
192+
enableListeners.remove("ShiftClickListener");
193+
shiftClickListener = null;
194+
}
195+
}
196+
if(rootNode.getNode("PortalLock", "Enable").getBoolean() && !enableListeners.contains("PortalListener")) {
197+
portalListener = new PortalListener(this);
198+
Sponge.getEventManager().registerListeners(this, portalListener);
199+
enableListeners.add("PortalListener");
200+
} else {
201+
if(portalListener != null) {
202+
Sponge.getEventManager().unregisterListeners(portalListener);
203+
enableListeners.remove("PortalListener");
204+
portalListener = null;
205+
}
152206
}
153207
}
154208
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package mr_krab.dupefixer.listeners;
2+
3+
import org.spongepowered.api.entity.Entity;
4+
import org.spongepowered.api.entity.Item;
5+
import org.spongepowered.api.entity.living.Living;
6+
import org.spongepowered.api.entity.living.player.Player;
7+
import org.spongepowered.api.event.Listener;
8+
import org.spongepowered.api.event.entity.MoveEntityEvent;
9+
import org.spongepowered.api.world.World;
10+
11+
import mr_krab.dupefixer.DupeFixer;
12+
13+
public class PortalListener {
14+
15+
private DupeFixer plugin;
16+
17+
public PortalListener(DupeFixer plugin) {
18+
this.plugin = plugin;
19+
}
20+
21+
@Listener
22+
public void onPortal(MoveEntityEvent.Teleport.Portal event) {
23+
Entity entity = event.getTargetEntity();
24+
if(plugin.getRootNode().getNode("PortalLock", "AllWorlds").getBoolean()) {
25+
if(plugin.getRootNode().getNode("PortalLock", "BlockTeleportation", "Items").getBoolean()) {
26+
if(entity instanceof Item) {
27+
event.setCancelled(true);
28+
}
29+
}
30+
if(plugin.getRootNode().getNode("PortalLock", "BlockTeleportation", "Mobs").getBoolean()) {
31+
if(entity instanceof Living && !(entity instanceof Player)) {
32+
event.setCancelled(true);
33+
}
34+
}
35+
if(plugin.getRootNode().getNode("PortalLock", "BlockTeleportation", "Players").getBoolean()) {
36+
if(entity instanceof Player) {
37+
event.setCancelled(true);
38+
}
39+
}
40+
} else {
41+
World world = event.getTargetEntity().getWorld();
42+
if(!plugin.getRootNode().getNode("PortalLock", world.getName(), "BlockTeleportation", "Items").isVirtual()) {
43+
if(plugin.getRootNode().getNode("PortalLock", world.getName(), "BlockTeleportation", "Items").getBoolean()) {
44+
if(entity instanceof Item) {
45+
event.setCancelled(true);
46+
}
47+
}
48+
}
49+
if(!plugin.getRootNode().getNode("PortalLock", world.getName(), "BlockTeleportation", "Mobs").isVirtual()) {
50+
if(plugin.getRootNode().getNode("PortalLock", world.getName(), "BlockTeleportation", "Mobs").getBoolean()) {
51+
if(entity instanceof Living && !(entity instanceof Player)) {
52+
event.setCancelled(true);
53+
}
54+
}
55+
}
56+
if(!plugin.getRootNode().getNode("PortalLock", world.getName(), "BlockTeleportation", "Players").isVirtual()) {
57+
if(plugin.getRootNode().getNode("PortalLock", world.getName(), "BlockTeleportation", "Players").getBoolean()) {
58+
if(entity instanceof Player) {
59+
event.setCancelled(true);
60+
}
61+
}
62+
}
63+
}
64+
}
65+
}

src/main/java/mr_krab/dupefixer/utils/ConfigUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void checkConfigVersion() {
3535
File renamedConfig = new File(plugin.getConfigDir() + File.separator + "ConfigOld.yml");
3636
if (!plugin.getRootNode().getNode("Config-Version").isVirtual()) {
3737
// This part can be supplemented.
38-
if (plugin.getRootNode().getNode("Config-Version").getInt() != 2) {
38+
if (plugin.getRootNode().getNode("Config-Version").getInt() != 3) {
3939
plugin.getLogger().warn("Attention!!! The version of your configuration file does not match the current one!");
4040
if(oldConfig.exists()) {
4141
oldConfig.renameTo(renamedConfig);

src/main/resources/assets/dupefixer/config.yml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Version of the config. Do not change!
2-
Config-Version: 2
2+
Config-Version: 3
33
# Debag used to search for items and containers with the help of which potential dupes can be performed.
44
Debug: false
55
# When the 'Enable' parameter is changed, a server reboot is required.
@@ -73,3 +73,21 @@ BlockShiftClick:
7373
Console: "&cPlayer &b%player% &ctrying to dupe using an item with id &a%item_id%&c."
7474
Player: "&4Sorry, but in this container this action is prohibited."
7575
Debug: "&ePlayer &b%player% &euse ShiftClick with item &f- &a%item%&e. Open container ID &f- &a%сontainer%&e."
76+
PortalLock:
77+
Enable: false
78+
# Worlds in which teleportation will be blocked
79+
AllWorlds: true
80+
BlockTeleportation:
81+
Items: true
82+
Mobs: false
83+
Players: false
84+
ExampleWorld1:
85+
BlockTeleportation:
86+
Items: true
87+
Mobs: false
88+
Players: false
89+
ExampleWorld2:
90+
BlockTeleportation:
91+
Items: true
92+
Mobs: true
93+
Players: false

src/mcmod.info

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{
33
"modid": "dupefixer",
44
"name": "DupeFixer",
5-
"version": "1.2",
5+
"version": "1.3",
66
"description": "Fix dupes in mods",
77
"authorList": [ "Mr_Krab" ],
88
"dependencies": [

0 commit comments

Comments
 (0)