Stable rift signature

This commit is contained in:
Runemoro 2018-01-02 04:40:12 -05:00
parent 3ea7e958f0
commit 8f1ef8c7bf
17 changed files with 193 additions and 61 deletions

View file

@ -44,6 +44,7 @@ public final class ModelManager {
register(ModItems.RIFT_BLADE);
register(ModItems.RIFT_REMOVER);
register(ModItems.RIFT_SIGNATURE);
register(ModItems.STABILIZED_RIFT_SIGNATURE);
register(ModItems.BOOTS_WOVEN_WORLD_THREAD);
register(ModItems.CHESTPLATE_WOVEN_WORLD_THREAD);
register(ModItems.HELMET_WOVEN_WORLD_THREAD);

View file

@ -91,5 +91,8 @@ public final class CraftingManager {
event.getRegistry().register(makeShapedRecipe(new ItemStack(ModItems.RIFT_SIGNATURE),
" x ", "xyx", "xxx", 'x', Items.GOLD_INGOT, 'y', ModItems.STABLE_FABRIC));
event.getRegistry().register(makeShapedRecipe(new ItemStack(ModItems.STABILIZED_RIFT_SIGNATURE),
" x ", "xyx", "xxx", 'x', ModItems.STABLE_FABRIC, 'y', ModItems.RIFT_SIGNATURE));
}
}

View file

@ -0,0 +1,17 @@
package org.dimdev.dimdoors.shared;
import lombok.*;
import net.minecraft.nbt.NBTTagCompound;
import org.dimdev.ddutils.Location;
import org.dimdev.ddutils.nbt.INBTStorable;
import org.dimdev.ddutils.nbt.NBTUtils;
import org.dimdev.ddutils.nbt.SavedToNBT;
@ToString @AllArgsConstructor @NoArgsConstructor
@SavedToNBT public class RotatedLocation implements INBTStorable {
@Getter @SavedToNBT /*private*/ Location location;
@Getter @SavedToNBT /*private*/ float yaw;
@Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { return NBTUtils.writeToNBT(this, nbt); }
@Override public void readFromNBT(NBTTagCompound nbt) { NBTUtils.readFromNBT(this, nbt); }
}

View file

@ -1,6 +1,5 @@
package org.dimdev.dimdoors.shared.items;
import lombok.*;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.*;
@ -9,14 +8,12 @@ import net.minecraft.util.text.translation.I18n;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import org.dimdev.ddutils.Location;
import org.dimdev.ddutils.nbt.INBTStorable;
import org.dimdev.ddutils.nbt.NBTUtils;
import org.dimdev.ddutils.nbt.SavedToNBT;
import org.dimdev.dimdoors.DimDoors;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import org.dimdev.dimdoors.shared.RotatedLocation;
import org.dimdev.dimdoors.shared.blocks.ModBlocks;
import org.dimdev.dimdoors.shared.rifts.GlobalDestination;
import org.dimdev.dimdoors.shared.rifts.TileEntityRift;
@ -31,7 +28,7 @@ public class ItemRiftSignature extends Item {
public ItemRiftSignature() {
setMaxStackSize(1);
setMaxDamage(10000);
setMaxDamage(1);
setCreativeTab(DimDoors.DIM_DOORS_CREATIVE_TAB);
setUnlocalizedName(ID);
setRegistryName(new ResourceLocation(DimDoors.MODID, ID));
@ -57,7 +54,7 @@ public class ItemRiftSignature extends Item {
}
pos = pos.offset(side);
Transform source = getSource(stack);
RotatedLocation source = getSource(stack);
if (source != null) {
// Place a rift at the destination point
@ -67,22 +64,22 @@ public class ItemRiftSignature extends Item {
rift1.setRotation(source.getYaw(), 0);
rift1.register();
// Place a rift at the destination point
// Place a rift at the source point
World sourceWorld = source.getLocation().getWorld();
sourceWorld.setBlockState(source.location.getPos(), ModBlocks.RIFT.getDefaultState());
sourceWorld.setBlockState(source.getLocation().getPos(), ModBlocks.RIFT.getDefaultState());
TileEntityRift rift2 = (TileEntityRift) source.getLocation().getTileEntity();
rift2.setSingleDestination(new GlobalDestination(rift1.getLocation()));
rift2.setRotation(source.getYaw(), 0);
rift2.register();
stack.damageItem(5000, player); // TODO: calculate damage based on position
stack.damageItem(1, player); // TODO: calculate damage based on position?
clearSource(stack);
DimDoors.chat(player, "Rift Created");
world.playSound(player, player.getPosition(), ModSounds.RIFT_END, SoundCategory.BLOCKS, 0.6f, 1);
} else {
// The link signature has not been used. Store its current target as the first location.
setSource(stack, new Transform(new Location(world, pos), player.rotationYaw));
setSource(stack, new RotatedLocation(new Location(world, pos), player.rotationYaw));
DimDoors.chat(player, "Location Stored in Rift Signature");
world.playSound(player, player.getPosition(), ModSounds.RIFT_START, SoundCategory.BLOCKS, 0.6f, 1);
}
@ -90,7 +87,7 @@ public class ItemRiftSignature extends Item {
return EnumActionResult.SUCCESS;
}
public static void setSource(ItemStack itemStack, Transform destination) {
public static void setSource(ItemStack itemStack, RotatedLocation destination) {
if (!itemStack.hasTagCompound()) itemStack.setTagCompound(new NBTTagCompound());
itemStack.getTagCompound().setTag("destination", destination.writeToNBT(new NBTTagCompound()));
}
@ -101,9 +98,9 @@ public class ItemRiftSignature extends Item {
}
}
public static Transform getSource(ItemStack itemStack) {
public static RotatedLocation getSource(ItemStack itemStack) {
if (itemStack.hasTagCompound() && itemStack.getTagCompound().hasKey("destination")) {
Transform transform = new Transform();
RotatedLocation transform = new RotatedLocation();
transform.readFromNBT(itemStack.getTagCompound().getCompoundTag("destination"));
return transform;
} else {
@ -114,20 +111,11 @@ public class ItemRiftSignature extends Item {
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, World worldIn, List<String> tooltip, ITooltipFlag flagIn) {
Transform transform = getSource(stack);
RotatedLocation transform = getSource(stack);
if (transform != null) {
tooltip.add(I18n.translateToLocalFormatted("info.rift_signature.bound", transform.getLocation().getX(), transform.getLocation().getY(), transform.getLocation().getZ(), transform.getLocation().getDim()));
} else {
translateAndAdd("info.rift_signature.unbound", tooltip);
}
}
@ToString @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE)
@SavedToNBT public static class Transform implements INBTStorable {
@Getter @SavedToNBT /*private*/ Location location;
@Getter @SavedToNBT /*private*/ float yaw;
@Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { return NBTUtils.writeToNBT(this, nbt); }
@Override public void readFromNBT(NBTTagCompound nbt) { NBTUtils.readFromNBT(this, nbt); }
}
}

View file

@ -0,0 +1,121 @@
package org.dimdev.dimdoors.shared.items;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.*;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.translation.I18n;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import org.dimdev.ddutils.Location;
import org.dimdev.dimdoors.DimDoors;
import org.dimdev.dimdoors.shared.RotatedLocation;
import org.dimdev.dimdoors.shared.blocks.ModBlocks;
import org.dimdev.dimdoors.shared.rifts.GlobalDestination;
import org.dimdev.dimdoors.shared.rifts.TileEntityRift;
import org.dimdev.dimdoors.shared.sound.ModSounds;
import java.util.List;
import static org.dimdev.ddutils.I18nUtils.translateAndAdd;
public class ItemStabilizedRiftSignature extends Item { // TODO: common superclass with rift signature
public static final String ID = "stabilized_rift_signature";
public ItemStabilizedRiftSignature() {
setMaxStackSize(1);
setMaxDamage(20);
setCreativeTab(DimDoors.DIM_DOORS_CREATIVE_TAB);
setUnlocalizedName(ID);
setRegistryName(new ResourceLocation(DimDoors.MODID, ID));
}
@SideOnly(Side.CLIENT)
@Override
public boolean hasEffect(ItemStack stack) {
return stack.getTagCompound() != null && stack.getTagCompound().hasKey("destination");
}
@Override
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) {
ItemStack stack = player.getHeldItem(hand);
// Return false on the client side to pass this request to the server
if (world.isRemote) {
return EnumActionResult.FAIL;
}
// Fail if the player can't place a block there TODO: spawn protection, other plugin support
if (!player.canPlayerEdit(pos, side.getOpposite(), stack)) {
return EnumActionResult.PASS;
}
pos = pos.offset(side);
RotatedLocation source = getSource(stack);
if (source != null) {
// Place a rift at the destination point
world.setBlockState(pos, ModBlocks.RIFT.getDefaultState());
TileEntityRift rift1 = (TileEntityRift) world.getTileEntity(pos);
rift1.setSingleDestination(new GlobalDestination(source.getLocation()));
rift1.setRotation(source.getYaw(), 0);
rift1.register();
// Place a rift at the source point
if (!source.getLocation().getBlockState().getBlock().equals(ModBlocks.RIFT)) {
World sourceWorld = source.getLocation().getWorld();
sourceWorld.setBlockState(source.getLocation().getPos(), ModBlocks.RIFT.getDefaultState());
TileEntityRift rift2 = (TileEntityRift) source.getLocation().getTileEntity();
rift2.setRotation(source.getYaw(), 0);
rift2.register();
}
stack.damageItem(1, player);
DimDoors.chat(player, "Rift Created");
world.playSound(player, player.getPosition(), ModSounds.RIFT_END, SoundCategory.BLOCKS, 0.6f, 1);
} else {
// The link signature has not been used. Store its current target as the first location.
setSource(stack, new RotatedLocation(new Location(world, pos), player.rotationYaw));
DimDoors.chat(player, "Location Stored in Rift Signature");
world.playSound(player, player.getPosition(), ModSounds.RIFT_START, SoundCategory.BLOCKS, 0.6f, 1);
}
return EnumActionResult.SUCCESS;
}
public static void setSource(ItemStack itemStack, RotatedLocation destination) {
if (!itemStack.hasTagCompound()) itemStack.setTagCompound(new NBTTagCompound());
itemStack.getTagCompound().setTag("destination", destination.writeToNBT(new NBTTagCompound()));
}
public static void clearSource(ItemStack itemStack) {
if (itemStack.hasTagCompound()) {
itemStack.getTagCompound().removeTag("destination");
}
}
public static RotatedLocation getSource(ItemStack itemStack) {
if (itemStack.hasTagCompound() && itemStack.getTagCompound().hasKey("destination")) {
RotatedLocation transform = new RotatedLocation();
transform.readFromNBT(itemStack.getTagCompound().getCompoundTag("destination"));
return transform;
} else {
return null;
}
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, World worldIn, List<String> tooltip, ITooltipFlag flagIn) {
RotatedLocation transform = getSource(stack);
if (transform != null) {
tooltip.add(I18n.translateToLocalFormatted("info.stabilized_rift_signature.bound", transform.getLocation().getX(), transform.getLocation().getY(), transform.getLocation().getZ(), transform.getLocation().getDim()));
} else {
translateAndAdd("info.stabilized_rift_signature.unbound", tooltip);
}
}
}

View file

@ -29,6 +29,7 @@ public final class ModItems {
public static final ItemRiftBlade RIFT_BLADE = new ItemRiftBlade();
public static final ItemRiftRemover RIFT_REMOVER = new ItemRiftRemover();
public static final ItemRiftSignature RIFT_SIGNATURE = new ItemRiftSignature();
public static final ItemStabilizedRiftSignature STABILIZED_RIFT_SIGNATURE = new ItemStabilizedRiftSignature();
// Armors
public static final ItemWovenWorldThreadArmor HELMET_WOVEN_WORLD_THREAD = new ItemWovenWorldThreadArmor("helmet_woven_world_thread", 1, EntityEquipmentSlot.HEAD);
@ -56,6 +57,7 @@ public final class ModItems {
RIFT_BLADE,
RIFT_REMOVER,
RIFT_SIGNATURE,
STABILIZED_RIFT_SIGNATURE,
HELMET_WOVEN_WORLD_THREAD,
CHESTPLATE_WOVEN_WORLD_THREAD,
LEGGINGS_WOVEN_WORLD_THREAD,

View file

@ -60,14 +60,14 @@ info.rift_remover1=um ihn und jegliche Spalte
info.rift_remover2=in der Nähe zu entfernen.
info.rift_signature.bound=Führt zu(%d, %d, %d) in Dimension #%d
info.rift_signature.unbound0=Erster Klick speichert die Position;
info.rift_signature.unbound1=zweiter Klick kreiert ein Paar von Spalten,
info.rift_signature.unbound2=welche zu den zwei Positionen führen.
info.rift_signature.stable0=Erster Klick speichert die Position,
info.rift_signature.stable1=weitere Klicks kreieren Spalte, die
info.rift_signature.stable2=die erste und die aktuelle Position verbinden.
info.stabilized_rift_signature.bound=Führt zu(%d, %d, %d) in Dimension #%d
info.stabilized_rift_signature.unbound0=Erster Klick speichert die Position,
info.stabilized_rift_signature.unbound1=weitere Klicks kreieren Spalte, die
info.stabilized_rift_signature.unbound2=die erste und die aktuelle Position verbinden.
info.unstable_dimensional_door=Vorsicht: Führt zu einem zufälligen Ziel

View file

@ -66,14 +66,14 @@ info.rift_remover1=to remove it and
info.rift_remover2=any nearby rifts.
info.rift_signature.bound=Leads to (%d, %d, %d) at dimension #%d
info.rift_signature.unbound0=First click stores a location;
info.rift_signature.unbound1=second click creates a pair of
info.rift_signature.unbound2=rifts linking the two locations.
info.rift_signature.stable0=First click stores a location,
info.rift_signature.stable1=other clicks create rifts linking
info.rift_signature.stable2=the first and last locations together.
info.stabilized_rift_signature.bound=Leads to (%d, %d, %d) at dimension #%d
info.stabilized_rift_signature.unbound0=First click stores a location,
info.stabilized_rift_signature.unbound1=other clicks create rifts linking
info.stabilized_rift_signature.unbound2=the first and last locations together.
info.unstable_dimensional_door=Caution: Leads to random destination

View file

@ -61,14 +61,14 @@ info.rift_remover1=exposée pour l'enlever ainsi
info.rift_remover2=que celles à proximité.
info.rift_signature.bound=Mène aux coordonnées (%d, %d, %d) à la dimension #%d
info.rift_signature.unbound0=Le premier clic stocke un emplacement ;
info.rift_signature.unbound1=le deuxième clic crée une paire de
info.rift_signature.unbound2=fissures qui lient les deux emplacements.
info.rift_signature.stable0=Le premier clic stocke un emplacement,
info.rift_signature.stable1=les autres clics créent des fissurent qui lient
info.rift_signature.stable2=le premier et les derniers emplacements ensemble.
info.stabilized_rift_signature.bound=Mène aux coordonnées (%d, %d, %d) à la dimension #%d
info.stabilized_rift_signature.unbound0=Le premier clic stocke un emplacement,
info.stabilized_rift_signature.unbound1=les autres clics créent des fissurent qui lient
info.stabilized_rift_signature.unbound2=le premier et les derniers emplacements ensemble.
info.unstable_dimensional_door=Attention : mène vers une destination aléatoire

View file

@ -60,14 +60,14 @@ info.rift_remover1=esposta per rimuovere quello
info.rift_remover2=e altre fratture vicine.
info.rift_signature.bound=Porta a (%d, %d, %d) nella dimensione #%d
info.rift_signature.unbound0=Al primo clic salva la posizione; al
info.rift_signature.unbound1=secondo clic crea un paio di fratture
info.rift_signature.unbound2=che collegano le due posizioni.
info.rift_signature.stable0=Al primo clic salva la posizione; al
info.rift_signature.stable1=secondo clic crea fratture che
info.rift_signature.stable2=collegano la prima e ultima posizione.
info.stabilized_rift_signature.bound=Porta a (%d, %d, %d) nella dimensione #%d
info.stabilized_rift_signature.unbound0=Al primo clic salva la posizione; al
info.stabilized_rift_signature.unbound1=secondo clic crea fratture che
info.stabilized_rift_signature.unbound2=collegano la prima e ultima posizione.
info.unstable_dimensional_door=Attenziione: Porta a una destinazione casuale

View file

@ -60,14 +60,14 @@ info.rift_remover1=om het te verwijderen en
info.rift_remover2=alle dichtbijzijnde scheuren.
info.rift_signature.bound=Leidt naar (%d, %d, %d) in dimensie #%d
info.rift_signature.unbound0=De eerste klik slaat een locatie op;
info.rift_signature.unbound1=de tweede creëert een paar scheuren
info.rift_signature.unbound2=die beide locaties met elkaar verbinden.
info.rift_signature.stable0=De eerste klik slaat een locatie op,
info.rift_signature.stable1=andere klikken creëren scheuren die de eerste
info.rift_signature.stable2=en laatste locaties met elkaar verbinden.
info.stabilized_rift_signature.bound=Leidt naar (%d, %d, %d) in dimensie #%d
info.stabilized_rift_signature.unbound0=De eerste klik slaat een locatie op,
info.stabilized_rift_signature.unbound1=andere klikken creëren scheuren die de eerste
info.stabilized_rift_signature.unbound2=en laatste locaties met elkaar verbinden.
info.unstable_dimensional_door=Pas op: Leidt naar een willekeurige bestemming

View file

@ -62,14 +62,14 @@ info.rift_remover1=expusa pentru a sterge acea
info.rift_remover2=fisură și ori ce fisuri apropiate.
info.rift_signature.bound=Duce la (%d, %d, %d) în dimensiunea #%d
info.rift_signature.unbound0=Primul clic stochează o locație;
info.rift_signature.unbound1=al doilea clic crează o pereche
info.rift_signature.unbound2=de fisuri conectând cele doua locații.
info.rift_signature.stable0=Primul clic stochează o locație;
info.rift_signature.stable1=alte clicuri crează fisuri conectând
info.rift_signature.stable2=prima și ultima conectiuni împreună.
info.stabilized_rift_signature.bound=Duce la (%d, %d, %d) în dimensiunea #%d
info.stabilized_rift_signature.unbound0=Primul clic stochează o locație;
info.stabilized_rift_signature.unbound1=alte clicuri crează fisuri conectând
info.stabilized_rift_signature.unbound2=prima și ultima conectiuni împreună.
info.unstable_dimensional_door=Atenție: Duce la o destinație aleatorie

View file

@ -60,14 +60,14 @@ info.rift_remover1=чтобы убрать его и
info.rift_remover2=другие ближайшие разломы.
info.rift_signature.bound=Ведёт в (%d, %d, %d) в измерение #%d
info.rift_signature.unbound0=Первое нажатие сохраняет расположение;
info.rift_signature.unbound1=второе нажатие создаёт пару
info.rift_signature.unbound2=разломов, соединяющих два расположения.
info.rift_signature.stable0=Первое нажатие сохраняет расположение,
info.rift_signature.stable1=остальные нажатия создают разломы, соединяющие
info.rift_signature.stable2=первое и последнее расположения вместе.
info.stabilized_rift_signature.bound=Ведёт в (%d, %d, %d) в измерение #%d
info.stabilized_rift_signature.unbound0=Первое нажатие сохраняет расположение,
info.stabilized_rift_signature.unbound1=остальные нажатия создают разломы, соединяющие
info.stabilized_rift_signature.unbound2=первое и последнее расположения вместе.
info.unstable_dimensional_door=Внимание: Ведёт неизвестно куда

View file

@ -60,14 +60,14 @@ info.rift_remover1=来移除它以及附近的其他
info.rift_remover2=裂痕.
info.rift_signature.bound=指向(%d, %d, %d) 位于#%d
info.rift_signature.unbound0=第一次点击记录一个位置;
info.rift_signature.unbound1=第二次点击在两地间创造
info.rift_signature.unbound2=一对相互连接的裂痕.
info.rift_signature.stable0=首次点击记录一个位置,
info.rift_signature.stable1=再次点击生成连接两地的
info.rift_signature.stable2=裂痕.
info.stabilized_rift_signature.bound=指向(%d, %d, %d) 位于#%d
info.stabilized_rift_signature.unbound0=首次点击记录一个位置,
info.stabilized_rift_signature.unbound1=再次点击生成连接两地的
info.stabilized_rift_signature.unbound2=裂痕.
info.unstable_dimensional_door=注意: 将会随机传送

View file

@ -1,6 +0,0 @@
{
"parent": "item/handheld",
"textures": {
"layer0": "dimdoors:items/stabilized_rift_sig"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/handheld",
"textures": {
"layer0": "dimdoors:items/stabilized_rift_signature"
}
}