Improved data storage

This commit is contained in:
Timo Ley 2019-06-08 12:49:20 +02:00
parent 8a811ffb3c
commit ba91b9db69
13 changed files with 268 additions and 79 deletions

View File

@ -1,5 +1,8 @@
package anvil.infinity;
import anvil.infinity.capabilities.Factory;
import anvil.infinity.capabilities.ICapabilityPlayerData;
import anvil.infinity.capabilities.Storage;
import anvil.infinity.compat.CompatHandler;
import anvil.infinity.config.ConfigHandler;
import anvil.infinity.networking.LookAbilityPackageHandler;
@ -8,6 +11,7 @@ import anvil.infinity.networking.PackageKillAbility;
import anvil.infinity.networking.PackageReq;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
@ -52,7 +56,7 @@ public class Infinity {
int netID = 0;
NETWORK_WRAPPER.registerMessage(LookAbilityReturnPackageHandler.class, PackageKillAbility.class, netID++, Side.SERVER);
NETWORK_WRAPPER.registerMessage(LookAbilityPackageHandler.class, PackageReq.class, netID++, Side.CLIENT);
CapabilityManager.INSTANCE.register(ICapabilityPlayerData.class, new Storage(), new Factory());
}

View File

@ -1,7 +1,7 @@
package anvil.infinity.abilities;
import anvil.infinity.data.EntityData;
import anvil.infinity.data.GauntletUserInformation;
import anvil.infinity.capabilities.GauntletUserInformation;
import anvil.infinity.capabilities.ICapabilityPlayerData;
import anvil.infinity.items.Items;
import lucraft.mods.lucraftcore.superpowers.abilities.AbilityAction;
import net.minecraft.client.Minecraft;
@ -22,10 +22,10 @@ public class AbilityChangeSnap extends AbilityAction {
@Override
public boolean action() {
EntityData data = GauntletUserInformation.getDataByEntity(entity);
data.selectedSnapResult = data.selectedSnapResult.next();
ICapabilityPlayerData data = GauntletUserInformation.getDataByEntity(entity);
data.setSnapResult(data.getSnapResult().next());
if (entity instanceof EntityPlayer) {
((EntityPlayer) entity).sendStatusMessage(new TextComponentString("Selected ability is: " + data.selectedSnapResult),true);
((EntityPlayer) entity).sendStatusMessage(new TextComponentString("Selected ability is: " + data.getSnapResult()),true);
}
return true;
}

View File

@ -1,35 +1,16 @@
package anvil.infinity.abilities;
import anvil.infinity.compat.CompatHandler;
import anvil.infinity.data.GauntletUserInformation;
import anvil.infinity.helpers.GauntelHelper;
import anvil.infinity.registry.Effects;
import anvil.infinity.snap.SnapHelper;
import anvil.infinity.snap.SnapResult;
import lucraft.mods.lucraftcore.infinity.ModuleInfinity;
import lucraft.mods.lucraftcore.superpowers.abilities.AbilityAction;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.passive.EntityRabbit;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.PotionEffect;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.management.PlayerList;
import net.minecraft.util.EnumHand;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List;
import java.util.Random;
public class AbilitySnap extends AbilityAction {

View File

@ -0,0 +1,22 @@
package anvil.infinity.capabilities;
import anvil.infinity.Infinity;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@Mod.EventBusSubscriber(modid = Infinity.MOD_ID)
public class CapabilityEventListener {
@SubscribeEvent
public static void onAttachCapabilities(AttachCapabilitiesEvent<Entity> e) {
Entity entity = e.getObject();
if (entity instanceof EntityPlayer) {
e.addCapability(new ResourceLocation(Infinity.MOD_ID, "playerCapability"), new CapabilityPlayerDataProvider(new CapabilityPlayerData()));
}
}
}

View File

@ -0,0 +1,95 @@
package anvil.infinity.capabilities;
import anvil.infinity.snap.SnapResult;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject;
public class CapabilityPlayerData implements ICapabilityPlayerData {
@CapabilityInject(ICapabilityPlayerData.class)
public static final Capability<ICapabilityPlayerData> capability = null;
public int xPos;
public int yPos;
public int zPos;
public int dim;
public SnapResult selectedSnapResult;
public CapabilityPlayerData() {
selectedSnapResult = SnapResult.KILLHALF;
}
@Override
public int getXPos() {
return xPos;
}
@Override
public int getYPos() {
return yPos;
}
@Override
public int getZPos() {
return zPos;
}
@Override
public int getDim() {
return dim;
}
@Override
public void setXPos(int xPos) {
this.xPos = xPos;
}
@Override
public void setYPos(int yPos) {
this.yPos = yPos;
}
@Override
public void setZPos(int zPos) {
this.zPos = zPos;
}
@Override
public void setDim(int dim) {
this.dim = dim;
}
@Override
public SnapResult getSnapResult() {
return selectedSnapResult;
}
@Override
public void setSnapResult(SnapResult snapResult) {
selectedSnapResult = snapResult;
}
@Override
public void readNBT(NBTTagCompound tag) {
setXPos(tag.getInteger("xPos"));
setYPos(tag.getInteger("YPos"));
setZPos(tag.getInteger("zPos"));
setDim(tag.getInteger("dim"));
setSnapResult(SnapResult.fromString(tag.getString("snapResult")));
}
@Override
public NBTTagCompound writeNBT() {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setInteger("xPos", getXPos());
nbt.setInteger("yPos", getYPos());
nbt.setInteger("zPos", getZPos());
nbt.setInteger("dim", getDim());
nbt.setString("snapResult", getSnapResult().toString());
return nbt;
}
}

View File

@ -0,0 +1,39 @@
package anvil.infinity.capabilities;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class CapabilityPlayerDataProvider implements ICapabilitySerializable<NBTTagCompound> {
ICapabilityPlayerData instance;
public CapabilityPlayerDataProvider(ICapabilityPlayerData instance) {
this.instance = instance;
}
@Override
public boolean hasCapability(@Nonnull Capability<?> capability, @Nullable EnumFacing facing) {
return capability == CapabilityPlayerData.capability;
}
@Nullable
@Override
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing) {
return capability == CapabilityPlayerData.capability ? CapabilityPlayerData.capability.<T>cast(instance) : null;
}
@Override
public NBTTagCompound serializeNBT() {
return (NBTTagCompound) CapabilityPlayerData.capability.getStorage().writeNBT(CapabilityPlayerData.capability, instance, null);
}
@Override
public void deserializeNBT(NBTTagCompound nbt) {
CapabilityPlayerData.capability.getStorage().readNBT(CapabilityPlayerData.capability, instance, null, nbt);
}
}

View File

@ -0,0 +1,11 @@
package anvil.infinity.capabilities;
import java.util.concurrent.Callable;
public class Factory implements Callable<ICapabilityPlayerData> {
@Override
public ICapabilityPlayerData call() throws Exception {
return new CapabilityPlayerData();
}
}

View File

@ -0,0 +1,18 @@
package anvil.infinity.capabilities;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import java.util.ArrayList;
import java.util.List;
public class GauntletUserInformation {
public static ICapabilityPlayerData getDataByEntity(EntityLivingBase entity) {
if (entity instanceof EntityPlayer && entity.hasCapability(CapabilityPlayerData.capability, null)) {
return entity.getCapability(CapabilityPlayerData.capability, null);
}
return new CapabilityPlayerData();
}
}

View File

@ -0,0 +1,24 @@
package anvil.infinity.capabilities;
import anvil.infinity.snap.SnapResult;
import net.minecraft.nbt.NBTTagCompound;
public interface ICapabilityPlayerData {
int getXPos();
int getYPos();
int getZPos();
int getDim();
void setXPos(int xPos);
void setYPos(int yPos);
void setZPos(int zPos);
void setDim(int dim);
SnapResult getSnapResult();
void setSnapResult(SnapResult snapResult);
void readNBT(NBTTagCompound nbt);
NBTTagCompound writeNBT();
}

View File

@ -0,0 +1,27 @@
package anvil.infinity.capabilities;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import javax.annotation.Nullable;
import java.util.List;
public class Storage implements Capability.IStorage<ICapabilityPlayerData> {
@Nullable
@Override
public NBTBase writeNBT(Capability<ICapabilityPlayerData> capability, ICapabilityPlayerData instance, EnumFacing side) {
return instance.writeNBT();
}
@Override
public void readNBT(Capability<ICapabilityPlayerData> capability, ICapabilityPlayerData instance, EnumFacing side, NBTBase nbt) {
if (nbt instanceof NBTTagCompound) {
instance.readNBT((NBTTagCompound) nbt);
}
}
}

View File

@ -1,21 +0,0 @@
package anvil.infinity.data;
import anvil.infinity.snap.SnapResult;
import net.minecraft.entity.EntityLivingBase;
public class EntityData {
public EntityLivingBase entity;
public int xPos;
public int yPos;
public int zPos;
public int dim;
public SnapResult selectedSnapResult;
public EntityData(EntityLivingBase entity) {
this.entity = entity;
selectedSnapResult = SnapResult.KILLHALF;
}
}

View File

@ -1,23 +0,0 @@
package anvil.infinity.data;
import net.minecraft.entity.EntityLivingBase;
import java.util.ArrayList;
import java.util.List;
public class GauntletUserInformation {
public static List<EntityData> gauntletUsers = new ArrayList<>();
public static EntityData getDataByEntity(EntityLivingBase entity) {
for (int i = 0; i < gauntletUsers.size(); i++) {
if (gauntletUsers.get(i).entity.equals(entity)) {
return gauntletUsers.get(i);
}
}
EntityData data = new EntityData(entity);
gauntletUsers.add(data);
return data;
}
}

View File

@ -1,11 +1,10 @@
package anvil.infinity.snap;
import anvil.infinity.capabilities.ICapabilityPlayerData;
import anvil.infinity.config.ConfigHandler;
import anvil.infinity.data.EntityData;
import anvil.infinity.data.GauntletUserInformation;
import anvil.infinity.capabilities.GauntletUserInformation;
import anvil.infinity.helpers.GauntelHelper;
import anvil.infinity.registry.Effects;
import lucraft.mods.lucraftcore.infinity.ModuleInfinity;
import lucraft.mods.lucraftcore.superpowers.abilities.supplier.IAbilityProvider;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
@ -22,7 +21,6 @@ import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.GameType;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraftforge.fml.common.FMLCommonHandler;
@ -35,10 +33,10 @@ public class SnapHelper {
static MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
public static boolean snap(EntityLivingBase entity) {
EntityData data = GauntletUserInformation.getDataByEntity(entity);
ICapabilityPlayerData data = GauntletUserInformation.getDataByEntity(entity);
if (GauntelHelper.hasFullGauntlet(entity)) {
WorldServer[] worlds = server.worlds;
if (data.selectedSnapResult == SnapResult.KILLHALF) {
if (data.getSnapResult() == SnapResult.KILLHALF) {
List<Entity> entities = new ArrayList<Entity>();
for (int i = 0; i < worlds.length; i++) {
entities.addAll(worlds[i].loadedEntityList);
@ -63,7 +61,7 @@ public class SnapHelper {
kill = !kill;
}
return true;
} else if (data.selectedSnapResult == SnapResult.DESTROYSTONES) {
} else if (data.getSnapResult() == SnapResult.DESTROYSTONES) {
entity.setHealth(1);
Item mainHand = entity.getHeldItemMainhand().getItem();
Item offHand = entity.getHeldItemOffhand().getItem();
@ -76,7 +74,7 @@ public class SnapHelper {
entity.attackEntityFrom(DamageSource.MAGIC, (entity.getHealth() / 10) - 0.01f);
} else if (data.selectedSnapResult == SnapResult.CREATIVE) {
} else if (data.getSnapResult() == SnapResult.CREATIVE) {
if (ConfigHandler.snapCreative) {
if (entity instanceof EntityPlayer) {
@ -88,9 +86,23 @@ public class SnapHelper {
return true;
}
}
} else if (data.selectedSnapResult == SnapResult.BRINGBACK) {
} else if (data.getSnapResult() == SnapResult.BRINGBACK) {
} else if (data.selectedSnapResult == SnapResult.RECREATE) {
} else if (data.getSnapResult() == SnapResult.RECREATE) {
} else if (data.getSnapResult() == SnapResult.KILLEVIL) {
List<Entity> entities = new ArrayList<Entity>();
for (int i = 0; i < worlds.length; i++) {
entities.addAll(worlds[i].loadedEntityList);
}
Random random = new Random();
for (int i = 0; i < entities.size(); i++) {
if (entities.get(i) != entity && entities.get(i) instanceof EntityLivingBase) {
EntityLivingBase e = ((EntityLivingBase) entities.get(i));
e.addPotionEffect(new PotionEffect(Effects.snapEffect, random.nextInt((1200 - 10) + 1) - 10));
}
}
}
}