190 lines
6.8 KiB
Java
190 lines
6.8 KiB
Java
package com.sekwah.advancedportals.core.services;
|
|
|
|
import com.google.inject.Inject;
|
|
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
|
import com.sekwah.advancedportals.core.registry.TagRegistry;
|
|
import com.sekwah.advancedportals.core.repository.ConfigRepository;
|
|
import com.sekwah.advancedportals.core.repository.IPortalRepository;
|
|
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
|
import com.sekwah.advancedportals.core.serializeddata.DataTag;
|
|
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
|
import com.sekwah.advancedportals.core.portal.AdvancedPortal;
|
|
import com.sekwah.advancedportals.core.serializeddata.PlayerData;
|
|
import com.sekwah.advancedportals.core.tags.activation.NameTag;
|
|
import com.sekwah.advancedportals.core.util.Lang;
|
|
import com.sekwah.advancedportals.core.util.PlayerUtils;
|
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
|
|
|
import javax.inject.Singleton;
|
|
import java.util.*;
|
|
|
|
@Singleton
|
|
public class PortalServices {
|
|
|
|
@Inject
|
|
private IPortalRepository portalRepository;
|
|
|
|
@Inject
|
|
private PlayerDataServices playerDataServices;
|
|
|
|
@Inject
|
|
private ConfigRepository configRepository;
|
|
|
|
private final Map<String, AdvancedPortal> portalCache = new HashMap<>();
|
|
|
|
@Inject
|
|
TagRegistry tagRegistry;
|
|
|
|
public void loadPortals() {
|
|
List<String> portalNames = portalRepository.getAllNames();
|
|
portalCache.clear();
|
|
for (String name : portalNames) {
|
|
AdvancedPortal portal = portalRepository.get(name);
|
|
portalCache.put(name, portal);
|
|
portal.updateBounds(portal.getMinLoc(), portal.getMaxLoc());
|
|
}
|
|
|
|
}
|
|
|
|
public boolean inPortalRegionProtected(BlockLocation loc) {
|
|
for (AdvancedPortal portal : portalCache.values()) {
|
|
if(portal.isLocationInPortal(loc, configRepository.getProtectionRadius())) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public boolean inPortalRegionProtected(PlayerLocation loc) {
|
|
for (AdvancedPortal portal : portalCache.values()) {
|
|
if(portal.isLocationInPortal(loc, configRepository.getProtectionRadius())) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public boolean inPortalRegion(BlockLocation loc, int extraBlocks) {
|
|
for (AdvancedPortal portal : portalCache.values()) {
|
|
if(portal.isLocationInPortal(loc, extraBlocks)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void playerMove(PlayerContainer player, PlayerLocation toLoc) {
|
|
|
|
var blockLoc = toLoc.toBlockPos();
|
|
var blockEntityTopLoc = blockLoc.addY(player.getHeight());
|
|
var world = player.getWorld();
|
|
var blockMaterial = world.getBlock(blockLoc);
|
|
var blockEntityTopMaterial = world.getBlock(blockEntityTopLoc);
|
|
|
|
var notInPortal = true;
|
|
for (AdvancedPortal portal : portalCache.values()) {
|
|
if ((portal.isLocationInPortal(toLoc)
|
|
&& portal.isTriggerBlock(blockMaterial))
|
|
|| (portal.isLocationInPortal(blockEntityTopLoc)
|
|
&& portal.isTriggerBlock(blockEntityTopMaterial))) {
|
|
notInPortal = false;
|
|
if(portal.activate(player, true)) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
var playerData = playerDataServices.getPlayerData(player);
|
|
if(!notInPortal) {
|
|
var strength = configRepository.getThrowbackStrength();
|
|
PlayerUtils.throwPlayerBack(player, strength);
|
|
}
|
|
if(playerData.isInPortal() && notInPortal) {
|
|
playerData.setInPortal(false);
|
|
}
|
|
}
|
|
|
|
public List<String> getPortalNames() {
|
|
return portalRepository.getAllNames();
|
|
}
|
|
|
|
public List<AdvancedPortal> getPortals() {
|
|
return new ArrayList<>(portalCache.values());
|
|
}
|
|
|
|
public boolean removePortal(String name, PlayerContainer player) {
|
|
this.portalCache.remove(name);
|
|
if(this.portalRepository.containsKey(name)) {
|
|
this.portalRepository.delete(name);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public AdvancedPortal createPortal(BlockLocation pos1, BlockLocation pos2, List<DataTag> tags) {
|
|
return createPortal(null, pos1, pos2, tags);
|
|
}
|
|
|
|
public AdvancedPortal createPortal(PlayerContainer player, ArrayList<DataTag> tags) {
|
|
PlayerData tempData = playerDataServices.getPlayerData(player);
|
|
|
|
if(tempData.getPos1() == null || tempData.getPos2() == null) {
|
|
player.sendMessage(Lang.translate("messageprefix.negative") + Lang.translate("portal.error.selection.missing"));
|
|
return null;
|
|
}
|
|
|
|
if(!tempData.getPos1().worldName.equals(tempData.getPos2().worldName)) {
|
|
player.sendMessage(Lang.translate("messageprefix.negative") + Lang.translate("portal.error.selection.differentworlds"));
|
|
return null;
|
|
}
|
|
|
|
return createPortal(player, tempData.getPos1(), tempData.getPos2(), tags);
|
|
}
|
|
|
|
public AdvancedPortal createPortal(PlayerContainer player, BlockLocation pos1, BlockLocation pos2, List<DataTag> tags) {
|
|
// Find the tag with the "name" NAME
|
|
DataTag nameTag = tags.stream().filter(tag -> tag.NAME.equals(NameTag.TAG_NAME)).findFirst().orElse(null);
|
|
|
|
String name = nameTag == null ? null : nameTag.VALUES[0];
|
|
if(nameTag == null || name == null || name.isEmpty()) {
|
|
if(player != null) player.sendMessage(Lang.translate("messageprefix.negative") + Lang.translate("command.error.noname"));
|
|
return null;
|
|
}
|
|
else if(this.portalRepository.containsKey(name)) {
|
|
if(player != null) player.sendMessage(Lang.translate("messageprefix.negative") + Lang.translateInsertVariables("command.error.nametaken", name));
|
|
return null;
|
|
}
|
|
|
|
AdvancedPortal portal = new AdvancedPortal(pos1, pos2);
|
|
|
|
for (DataTag portalTag : tags) {
|
|
portal.setArgValues(portalTag);
|
|
}
|
|
|
|
for (DataTag portalTag : tags) {
|
|
Tag.Creation creation = tagRegistry.getCreationHandler(portalTag.NAME);
|
|
if(creation != null) {
|
|
if(!creation.created(portal, player, portalTag.VALUES)) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
try {
|
|
if(this.portalRepository.save(name, portal)) {
|
|
this.portalCache.put(name, portal);
|
|
} else {
|
|
return null;
|
|
}
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
if(player != null) player.sendMessage(Lang.translate("messageprefix.negative") + Lang.translate("portal.error.save"));
|
|
}
|
|
|
|
return portal;
|
|
}
|
|
|
|
public boolean removePlayerSelection(PlayerContainer player) {
|
|
return false;
|
|
}
|
|
}
|