Compare commits

...

31 commits

Author SHA1 Message Date
17fd5d5fee 1.15 update fixes 2020-09-29 23:33:51 +02:00
3c5fdf5847
Merge pull request #26 from Theta-Dev/update_1.5
Update 1.5 -> 1.5
2020-09-29 22:53:14 +02:00
2abea82c76
Merge branch '1.15' into update_1.5 2020-09-29 22:53:02 +02:00
b848742f90
Merge branch '1.16' into update_1.5 2020-09-29 22:47:29 +02:00
3aee9629df Fixed stack overflow when placing many connecting blocks (1.16) 2020-09-18 22:29:53 +02:00
a966a47209 Merge remote-tracking branch 'origin/1.15' into 1.15
# Conflicts:
#	src/main/java/thetadev/constructionwand/job/WandJob.java
2020-09-18 22:02:53 +02:00
cb01f789cb Fixed stack overflow when placing many connecting blocks 2020-09-18 22:01:40 +02:00
a29ce8cc22 Fixed stack overflow when placing many connecting blocks 2020-09-18 21:32:42 +02:00
a0be0884f6 Changed readme 2020-09-18 13:08:19 +02:00
40a4df7a20 Changed readme 2020-09-18 13:06:12 +02:00
7b291d514f Changed botania version 2020-09-18 00:20:09 +02:00
e6e282427b
Merge pull request #22 from Theta-Dev/update1.3
Update1.3 -> 1.15
2020-09-18 00:16:41 +02:00
0ea9cfaf46 Changed version to 1.15 2020-09-18 00:16:15 +02:00
3003cdcf18 Merge branch '1.15' into update1.3 2020-09-18 00:15:17 +02:00
0d90de89cf
Removed duplicate forge declaration 2020-09-17 23:26:40 +02:00
fe89f27aaa Set direction default to TARGET 2020-09-17 23:19:19 +02:00
9aec266dd2 Set mc/forge version 2020-09-17 23:17:02 +02:00
0ca8f23b69
Merge pull request #21 from Theta-Dev/update1.3
Update1.3 -> 1.16
2020-09-17 23:03:50 +02:00
e4ca89680d
Merge branch '1.16' into update1.3 2020-09-17 23:03:42 +02:00
d87c7f7d1b fix exception with no-collision blocks 2020-08-27 00:10:38 +02:00
87ab64675f
Merge pull request #18 from Theta-Dev/fix_collision
Fix collision
2020-08-26 23:56:00 +02:00
b9353126eb
Merge branch '1.15' into fix_collision 2020-08-26 23:55:52 +02:00
20b016dd57
Merge pull request #17 from Theta-Dev/fix_collision
Fix collision
2020-08-26 23:51:57 +02:00
95d3c504ba
Merge branch '1.16' into fix_collision 2020-08-26 23:51:47 +02:00
4876683b07 placement dir improvements 2020-08-26 17:39:21 +02:00
64f947e535 Revert "Merge branch '1.16' into 1.15"
This reverts commit cd99733803, reversing
changes made to fa1587f269.
2020-08-26 17:24:31 +02:00
cd99733803 Merge branch '1.16' into 1.15 2020-08-26 17:20:13 +02:00
1186043bf3 placement dir improvements 2020-08-26 17:18:54 +02:00
fa1587f269
Merge pull request #13 from Theta-Dev/1.15_1.2
Update 1.2
2020-08-26 01:06:37 +02:00
e3918bc9bb
Update README.md 2020-08-15 21:10:51 +02:00
89fbd5313b
Update README.md 2020-08-03 21:56:39 +02:00
20 changed files with 81 additions and 100 deletions

View file

@ -59,4 +59,4 @@ SHIFT+Right clicking empty space opens the option screen of your wand.
- Look at your statisics to see how many blocks you have placed using your wand - Look at your statisics to see how many blocks you have placed using your wand
- **1.16+ only:** The Infinity Wand won't burn in lava just like netherite gear. - **1.16+ only:** The Infinity Wand won't burn in lava just like netherite gear.

View file

@ -104,6 +104,10 @@ dependencies {
version: "${project.botania}", version: "${project.botania}",
classifier: "api" classifier: "api"
]) ])
//runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:1.15.2-1.2-32.160")
//runtimeOnly fg.deobf("top.theillusivec4.curios:curios:FORGE-1.15.2-2.0.2.4")
//runtimeOnly fg.deobf("vazkii.botania:Botania:r1.15-387.455")
} }
jar { jar {
@ -137,4 +141,4 @@ publishing {
url "file:///${project.projectDir}/mcmodsrepo" url "file:///${project.projectDir}/mcmodsrepo"
} }
} }
} }

View file

@ -4,11 +4,11 @@ org.gradle.daemon=false
author=thetadev author=thetadev
modid=constructionwand modid=constructionwand
mcversion=1.16.2 mcversion=1.15.2
forgeversion=33.0.60 forgeversion=31.2.31
mcp_mappings=20200723-1.16.1 mcp_mappings=20200514-1.15.1
botania=1.16.2-405 botania=r1.15-387.455
version_major=1 version_major=1
version_minor=5 version_minor=5

View file

@ -11,7 +11,7 @@
"conditions": { "conditions": {
"items": [ "items": [
{ {
"tag": "minecraft:stone_tool_materials" "tag": "forge:cobblestone"
} }
] ]
} }

View file

@ -7,7 +7,7 @@
], ],
"key": { "key": {
"X": { "X": {
"tag": "minecraft:stone_tool_materials" "tag": "forge:cobblestone"
}, },
"#": { "#": {
"tag": "forge:rods/wooden" "tag": "forge:rods/wooden"

View file

@ -80,7 +80,6 @@ public class ConstructionWand
{ {
renderBlockPreview = new RenderBlockPreview(); renderBlockPreview = new RenderBlockPreview();
MinecraftForge.EVENT_BUS.register(renderBlockPreview); MinecraftForge.EVENT_BUS.register(renderBlockPreview);
ModItems.registerModelProperties();
} }
public static ResourceLocation loc(String name) { public static ResourceLocation loc(String name) {

View file

@ -7,7 +7,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.Vec3d;
import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.ConstructionWand;
import thetadev.constructionwand.items.ItemWand; import thetadev.constructionwand.items.ItemWand;
@ -37,16 +37,8 @@ public class WandUtil
return null; return null;
} }
public static BlockPos playerPos(PlayerEntity player) { public static Vec3d entityPositionVec(Entity entity) {
return new BlockPos(player.getPositionVec()); return new Vec3d(entity.getPosX(), entity.getPosY() - entity.getYOffset() + entity.getHeight()/2, entity.getPosZ());
}
public static Vector3d entityPositionVec(Entity entity) {
return new Vector3d(entity.getPosX(), entity.getPosY() - entity.getYOffset() + entity.getHeight()/2, entity.getPosZ());
}
public static Vector3d blockPosVec(BlockPos pos) {
return new Vector3d(pos.getX(), pos.getY(), pos.getZ());
} }
public static List<ItemStack> getHotbar(PlayerEntity player) { public static List<ItemStack> getHotbar(PlayerEntity player) {

View file

@ -17,7 +17,7 @@ public class RenderTypes
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc(); RenderSystem.defaultBlendFunc();
}, RenderSystem::disableBlend); }, RenderSystem::disableBlend);
protected static final RenderState.DepthTestState DEPTH_ALWAYS = new RenderState.DepthTestState("always", GL11.GL_ALWAYS); protected static final RenderState.DepthTestState DEPTH_ALWAYS = new RenderState.DepthTestState(GL11.GL_ALWAYS);
static { static {
RenderType.State translucentNoDepthState = RenderType.State.getBuilder().transparency(TRANSLUCENT_TRANSPARENCY) RenderType.State translucentNoDepthState = RenderType.State.getBuilder().transparency(TRANSLUCENT_TRANSPARENCY)

View file

@ -1,6 +1,5 @@
package thetadev.constructionwand.client; package thetadev.constructionwand.client;
import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.button.Button; import net.minecraft.client.gui.widget.button.Button;
@ -13,10 +12,13 @@ import thetadev.constructionwand.basics.option.IOption;
import thetadev.constructionwand.basics.option.WandOptions; import thetadev.constructionwand.basics.option.WandOptions;
import thetadev.constructionwand.network.PacketWandOption; import thetadev.constructionwand.network.PacketWandOption;
import java.util.HashMap;
public class ScreenWand extends Screen public class ScreenWand extends Screen
{ {
private final ItemStack wand; private final ItemStack wand;
private final WandOptions wandOptions; private final WandOptions wandOptions;
private final HashMap<IOption<?>, Button> optionButtons;
private static final int BUTTON_WIDTH = 160; private static final int BUTTON_WIDTH = 160;
private static final int BUTTON_HEIGHT = 20; private static final int BUTTON_HEIGHT = 20;
@ -32,11 +34,13 @@ public class ScreenWand extends Screen
super(new StringTextComponent("ScreenWand")); super(new StringTextComponent("ScreenWand"));
this.wand = wand; this.wand = wand;
wandOptions = new WandOptions(wand); wandOptions = new WandOptions(wand);
optionButtons = new HashMap<>();
} }
@Override @Override
public void init(Minecraft minecraft, int width, int height) { public void init(Minecraft minecraft, int width, int height) {
super.init(minecraft, width, height); super.init(minecraft, width, height);
optionButtons.clear();
createButton(0, 0, wandOptions.mode); createButton(0, 0, wandOptions.mode);
createButton(0, 1, wandOptions.lock); createButton(0, 1, wandOptions.lock);
@ -47,33 +51,35 @@ public class ScreenWand extends Screen
} }
@Override @Override
public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { public void render(int mouseX, int mouseY, float partialTicks) {
renderBackground(matrixStack); renderBackground();
super.render(matrixStack, mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
drawCenteredString(matrixStack, font, wand.getDisplayName(), width/2, height/2 - FIELD_HEIGHT/2 - SPACING_HEIGHT, 16777215); drawCenteredString(font, wand.getDisplayName().getFormattedText(), width/2, height/2 - FIELD_HEIGHT/2 - SPACING_HEIGHT, 16777215);
optionButtons.forEach((opt, but) -> drawTooltip(mouseX, mouseY, opt, but));
} }
@Override @Override
public boolean charTyped(char character, int code) { public boolean charTyped(char character, int code) {
if(character == 'e') closeScreen(); if(character == 'e') onClose();
return super.charTyped(character, code); return super.charTyped(character, code);
} }
private void createButton(int cx, int cy, IOption<?> option) { private void createButton(int cx, int cy, IOption<?> option) {
Button button = new Button(getX(cx), getY(cy), BUTTON_WIDTH, BUTTON_HEIGHT, getButtonLabel(option), bt -> clickButton(bt, option), (bt, ms, x, y) -> drawTooltip(ms, x, y, option)); Button button = new Button(getX(cx), getY(cy), BUTTON_WIDTH, BUTTON_HEIGHT, getButtonLabel(option).getFormattedText(), bt -> clickButton(bt, option));
button.active = option.isEnabled(); button.active = option.isEnabled();
addButton(button); addButton(button);
optionButtons.put(option, button);
} }
private void clickButton(Button button, IOption<?> option) { private void clickButton(Button button, IOption<?> option) {
option.next(); option.next();
ConstructionWand.instance.HANDLER.sendToServer(new PacketWandOption(option, false)); ConstructionWand.instance.HANDLER.sendToServer(new PacketWandOption(option, false));
button.setMessage(getButtonLabel(option)); button.setMessage(getButtonLabel(option).getFormattedText());
} }
private void drawTooltip(MatrixStack matrixStack, int mouseX, int mouseY, IOption<?> option) { private void drawTooltip(int mouseX, int mouseY, IOption<?> option, Button button) {
if(isMouseOver(mouseX, mouseY)) { if(button.isHovered()) {
renderTooltip(matrixStack, new TranslationTextComponent(option.getDescTranslation()), mouseX, mouseY); renderTooltip(new TranslationTextComponent(option.getDescTranslation()).getFormattedText(), mouseX, mouseY);
} }
} }
@ -86,6 +92,6 @@ public class ScreenWand extends Screen
} }
private ITextComponent getButtonLabel(IOption<?> option) { private ITextComponent getButtonLabel(IOption<?> option) {
return new TranslationTextComponent(option.getKeyTranslation()).append(new TranslationTextComponent(option.getValueTranslation())); return new TranslationTextComponent(option.getKeyTranslation()).appendSibling(new TranslationTextComponent(option.getValueTranslation()));
} }
} }

View file

@ -3,7 +3,7 @@ package thetadev.constructionwand.data;
import net.minecraft.advancements.criterion.ItemPredicate; import net.minecraft.advancements.criterion.ItemPredicate;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.Ingredient;
import net.minecraft.tags.ITag; import net.minecraft.tags.Tag;
import net.minecraft.util.IItemProvider; import net.minecraft.util.IItemProvider;
public class Inp public class Inp
@ -21,7 +21,7 @@ public class Inp
public static Inp fromItem(IItemProvider in) { public static Inp fromItem(IItemProvider in) {
return new Inp(in.asItem().getRegistryName().getPath(), Ingredient.fromItems(in), ItemPredicate.Builder.create().item(in).build()); return new Inp(in.asItem().getRegistryName().getPath(), Ingredient.fromItems(in), ItemPredicate.Builder.create().item(in).build());
} }
public static Inp fromTag(ITag.INamedTag<Item> in) { public static Inp fromTag(Tag<Item> in) {
return new Inp(in.getName().getPath(), Ingredient.fromTag(in), ItemPredicate.Builder.create().tag(in).build()); return new Inp(in.getId().getPath(), Ingredient.fromTag(in), ItemPredicate.Builder.create().tag(in).build());
} }
} }

View file

@ -4,7 +4,6 @@ import net.minecraft.data.DataGenerator;
import net.minecraft.data.IFinishedRecipe; import net.minecraft.data.IFinishedRecipe;
import net.minecraft.data.RecipeProvider; import net.minecraft.data.RecipeProvider;
import net.minecraft.data.ShapedRecipeBuilder; import net.minecraft.data.ShapedRecipeBuilder;
import net.minecraft.tags.ItemTags;
import net.minecraft.util.IItemProvider; import net.minecraft.util.IItemProvider;
import net.minecraftforge.common.Tags; import net.minecraftforge.common.Tags;
import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.ConstructionWand;
@ -20,7 +19,7 @@ public class RecipeGenerator extends RecipeProvider
@Override @Override
protected void registerRecipes(Consumer<IFinishedRecipe> consumer) { protected void registerRecipes(Consumer<IFinishedRecipe> consumer) {
wandRecipe(consumer, ModItems.WAND_STONE, Inp.fromTag(ItemTags.field_232909_aa_)); //stone_tool_materials wandRecipe(consumer, ModItems.WAND_STONE, Inp.fromTag(Tags.Items.COBBLESTONE));
wandRecipe(consumer, ModItems.WAND_IRON, Inp.fromTag(Tags.Items.INGOTS_IRON)); wandRecipe(consumer, ModItems.WAND_IRON, Inp.fromTag(Tags.Items.INGOTS_IRON));
wandRecipe(consumer, ModItems.WAND_DIAMOND, Inp.fromTag(Tags.Items.GEMS_DIAMOND)); wandRecipe(consumer, ModItems.WAND_DIAMOND, Inp.fromTag(Tags.Items.GEMS_DIAMOND));
wandRecipe(consumer, ModItems.WAND_INFINITY, Inp.fromTag(Tags.Items.NETHER_STARS)); wandRecipe(consumer, ModItems.WAND_INFINITY, Inp.fromTag(Tags.Items.NETHER_STARS));

View file

@ -11,6 +11,7 @@ import net.minecraft.item.ItemUseContext;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.ActionResultType; import net.minecraft.util.ActionResultType;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
@ -33,6 +34,7 @@ public abstract class ItemWand extends Item
public ItemWand(String name, Item.Properties properties) { public ItemWand(String name, Item.Properties properties) {
super(properties.group(ItemGroup.TOOLS)); super(properties.group(ItemGroup.TOOLS));
setRegistryName(ConstructionWand.loc(name)); setRegistryName(ConstructionWand.loc(name));
addPropertyOverride(new ResourceLocation(ConstructionWand.MODID, "wand_mode"), (stack, worldIn, entityIn) -> getWandMode(stack));
} }
@Override @Override
@ -103,26 +105,26 @@ public abstract class ItemWand extends Item
if(Screen.hasShiftDown()) { if(Screen.hasShiftDown()) {
for(int i=1; i<options.allOptions.length; i++) { for(int i=1; i<options.allOptions.length; i++) {
IOption<?> opt = options.allOptions[i]; IOption<?> opt = options.allOptions[i];
lines.add(new TranslationTextComponent(opt.getKeyTranslation()).mergeStyle(TextFormatting.AQUA) lines.add(new TranslationTextComponent(opt.getKeyTranslation()).applyTextStyle(TextFormatting.AQUA)
.append(new TranslationTextComponent(opt.getValueTranslation()).mergeStyle(TextFormatting.GRAY)) .appendSibling(new TranslationTextComponent(opt.getValueTranslation()).applyTextStyle(TextFormatting.GRAY))
); );
} }
} }
else { else {
IOption<?> opt = options.allOptions[0]; IOption<?> opt = options.allOptions[0];
lines.add(new TranslationTextComponent(langTooltip + "blocks", getLimit()).mergeStyle(TextFormatting.GRAY)); lines.add(new TranslationTextComponent(langTooltip + "blocks", getLimit()).applyTextStyle(TextFormatting.GRAY));
lines.add(new TranslationTextComponent(opt.getKeyTranslation()).mergeStyle(TextFormatting.AQUA) lines.add(new TranslationTextComponent(opt.getKeyTranslation()).applyTextStyle(TextFormatting.AQUA)
.append(new TranslationTextComponent(opt.getValueTranslation()).mergeStyle(TextFormatting.WHITE))); .appendSibling(new TranslationTextComponent(opt.getValueTranslation()).applyTextStyle(TextFormatting.WHITE)));
lines.add(new TranslationTextComponent(langTooltip + "shift").mergeStyle(TextFormatting.AQUA)); lines.add(new TranslationTextComponent(langTooltip + "shift").applyTextStyle(TextFormatting.AQUA));
} }
} }
public static void optionMessage(PlayerEntity player, IOption<?> option) { public static void optionMessage(PlayerEntity player, IOption<?> option) {
player.sendStatusMessage( player.sendStatusMessage(
new TranslationTextComponent(option.getKeyTranslation()).mergeStyle(TextFormatting.AQUA) new TranslationTextComponent(option.getKeyTranslation()).applyTextStyle(TextFormatting.AQUA)
.append(new TranslationTextComponent(option.getValueTranslation()).mergeStyle(TextFormatting.WHITE)) .appendSibling(new TranslationTextComponent(option.getValueTranslation()).applyTextStyle(TextFormatting.WHITE))
.append(new StringTextComponent(" - ").mergeStyle(TextFormatting.GRAY)) .appendSibling(new StringTextComponent(" - ").applyTextStyle(TextFormatting.GRAY))
.append(new TranslationTextComponent(option.getDescTranslation()).mergeStyle(TextFormatting.WHITE)) .appendSibling(new TranslationTextComponent(option.getDescTranslation()).applyTextStyle(TextFormatting.WHITE))
, true); , true);
} }
} }

View file

@ -2,12 +2,7 @@ package thetadev.constructionwand.items;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.IItemTier; import net.minecraft.item.IItemTier;
import net.minecraft.item.Item;
import net.minecraft.item.Item.Properties;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.tags.ItemTags;
import net.minecraft.util.ResourceLocation;
import thetadev.constructionwand.basics.ConfigServer; import thetadev.constructionwand.basics.ConfigServer;
public class ItemWandBasic extends ItemWand public class ItemWandBasic extends ItemWand

View file

@ -9,7 +9,7 @@ public class ItemWandInfinity extends ItemWand
{ {
public ItemWandInfinity(String name) public ItemWandInfinity(String name)
{ {
super(name, new Properties().maxStackSize(1).isBurnable()); super(name, new Properties().maxStackSize(1));
} }
@Override @Override

View file

@ -1,7 +1,6 @@
package thetadev.constructionwand.items; package thetadev.constructionwand.items;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemModelsProperties;
import net.minecraft.item.ItemTier; import net.minecraft.item.ItemTier;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent;
@ -26,13 +25,4 @@ public class ModItems
{ {
event.getRegistry().registerAll(WANDS); event.getRegistry().registerAll(WANDS);
} }
public static void registerModelProperties() {
for(Item item : WANDS) {
ItemModelsProperties.func_239418_a_(
item, new ResourceLocation(ConstructionWand.MODID, "wand_mode"),
(stack, world, entity) -> entity == null || !(stack.getItem() instanceof ItemWand) ? 0 : ItemWand.getWandMode(stack)
);
}
}
} }

View file

@ -6,7 +6,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import thetadev.constructionwand.basics.ConfigServer; import thetadev.constructionwand.basics.ConfigServer;
import thetadev.constructionwand.basics.WandUtil; import thetadev.constructionwand.basics.WandUtil;
@ -15,10 +15,10 @@ import thetadev.constructionwand.basics.option.WandOptions;
public class AngelJob extends WandJob public class AngelJob extends WandJob
{ {
public AngelJob(PlayerEntity player, World world, ItemStack wand) { public AngelJob(PlayerEntity player, World world, ItemStack wand) {
super(player, world, new BlockRayTraceResult(player.getLookVec(), fromVector(player.getLookVec()), WandUtil.playerPos(player), false), wand); super(player, world, new BlockRayTraceResult(player.getLookVec(), fromVector(player.getLookVec()), player.getPosition(), false), wand);
} }
private static Direction fromVector(Vector3d vector) { private static Direction fromVector(Vec3d vector) {
return Direction.getFacingFromVector(vector.x, vector.y, vector.z); return Direction.getFacingFromVector(vector.x, vector.y, vector.z);
} }
@ -28,9 +28,9 @@ public class AngelJob extends WandJob
if(!player.isCreative() && !ConfigServer.ANGEL_FALLING.get() && player.fallDistance > 10) return; if(!player.isCreative() && !ConfigServer.ANGEL_FALLING.get() && player.fallDistance > 10) return;
Vector3d playerVec = WandUtil.entityPositionVec(player); Vec3d playerVec = WandUtil.entityPositionVec(player);
Vector3d lookVec = player.getLookVec().mul(2, 2, 2); Vec3d lookVec = player.getLookVec().mul(2, 2, 2);
Vector3d placeVec = playerVec.add(lookVec); Vec3d placeVec = playerVec.add(lookVec);
BlockPos currentPos = new BlockPos(placeVec); BlockPos currentPos = new BlockPos(placeVec);

View file

@ -140,7 +140,7 @@ public class UndoHistory
// Play teleport sound // Play teleport sound
SoundEvent sound = SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT; SoundEvent sound = SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT;
world.playSound(null, WandUtil.playerPos(player), sound, SoundCategory.PLAYERS, 1.0F, 1.0F); world.playSound(null, player.getPosition(), sound, SoundCategory.PLAYERS, 1.0F, 1.0F);
return true; return true;
} }

View file

@ -6,8 +6,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.Vec3d;
import thetadev.constructionwand.basics.WandUtil;
public class WandItemUseContext extends BlockItemUseContext public class WandItemUseContext extends BlockItemUseContext
{ {
@ -15,10 +14,9 @@ public class WandItemUseContext extends BlockItemUseContext
super(job.world, job.player, Hand.MAIN_HAND, new ItemStack(item), new BlockRayTraceResult(getBlockHitVec(job, pos), job.rayTraceResult.getFace(), pos, false)); super(job.world, job.player, Hand.MAIN_HAND, new ItemStack(item), new BlockRayTraceResult(getBlockHitVec(job, pos), job.rayTraceResult.getFace(), pos, false));
} }
private static Vector3d getBlockHitVec(WandJob job, BlockPos pos) { private static Vec3d getBlockHitVec(WandJob job, BlockPos pos) {
Vector3d hitVec = job.rayTraceResult.getHitVec(); // Absolute coords of hit target Vec3d hitVec = job.rayTraceResult.getHitVec(); // Absolute coords of hit target
Vec3d blockDelta = new Vec3d(job.rayTraceResult.getPos()).subtract(new Vec3d(pos)); // Vector between start and current block
Vector3d blockDelta = WandUtil.blockPosVec(job.rayTraceResult.getPos()).subtract(WandUtil.blockPosVec(pos)); // Vector between start and current block
return blockDelta.add(hitVec); // Absolute coords of current block hit target return blockDelta.add(hitVec); // Absolute coords of current block hit target
} }

View file

@ -4,7 +4,7 @@ import net.minecraft.block.*;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.*; import net.minecraft.item.*;
import net.minecraft.state.Property; import net.minecraft.state.IProperty;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.state.properties.SlabType; import net.minecraft.state.properties.SlabType;
import net.minecraft.stats.Stats; import net.minecraft.stats.Stats;
@ -233,7 +233,7 @@ public abstract class WandJob
// Draw item from pool (returns null if none are left) // Draw item from pool (returns null if none are left)
BlockItem item = itemPool.draw(); BlockItem item = itemPool.draw();
if(item == null) return null; if(item == null) return null;
int count = itemCounts.get(item); int count = itemCounts.get(item);
if(count == 0) continue; if(count == 0) continue;
@ -273,36 +273,33 @@ public abstract class WandJob
if(options.direction.get() == WandOptions.DIRECTION.TARGET) { if(options.direction.get() == WandOptions.DIRECTION.TARGET) {
// Block properties to be copied (alignment/rotation properties) // Block properties to be copied (alignment/rotation properties)
for(Property property : new Property[] { for(IProperty property : new IProperty[] {
BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.FACING, BlockStateProperties.FACING_EXCEPT_UP, BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.FACING, BlockStateProperties.FACING_EXCEPT_UP,
BlockStateProperties.ROTATION_0_15, BlockStateProperties.AXIS, BlockStateProperties.HALF, BlockStateProperties.STAIRS_SHAPE}) BlockStateProperties.ROTATION_0_15, BlockStateProperties.AXIS, BlockStateProperties.HALF, BlockStateProperties.STAIRS_SHAPE})
{ {
if(supportingBlock.hasProperty(property) && placeBlock.hasProperty(property)) { if(supportingBlock.has(property) && placeBlock.has(property)) {
placeBlock = placeBlock.with(property, supportingBlock.get(property)); placeBlock = placeBlock.with(property, supportingBlock.get(property));
} }
} }
// Dont dupe double slabs // Dont dupe double slabs
if(supportingBlock.hasProperty(BlockStateProperties.SLAB_TYPE) && placeBlock.hasProperty(BlockStateProperties.SLAB_TYPE)) { if(supportingBlock.has(BlockStateProperties.SLAB_TYPE) && placeBlock.has(BlockStateProperties.SLAB_TYPE)) {
SlabType slabType = supportingBlock.get(BlockStateProperties.SLAB_TYPE); SlabType slabType = supportingBlock.get(BlockStateProperties.SLAB_TYPE);
if(slabType != SlabType.DOUBLE) placeBlock = placeBlock.with(BlockStateProperties.SLAB_TYPE, slabType); if(slabType != SlabType.DOUBLE) placeBlock = placeBlock.with(BlockStateProperties.SLAB_TYPE, slabType);
} }
} }
// Abort if placeEvent is canceled
BlockSnapshot snapshot = new BlockSnapshot(world, blockPos, placeBlock);
BlockEvent.EntityPlaceEvent placeEvent = new BlockEvent.EntityPlaceEvent(snapshot, placeBlock, player);
MinecraftForge.EVENT_BUS.post(placeEvent);
if(placeEvent.isCanceled()) return false;
// Place the block // Place the block
if(!world.setBlockState(blockPos, placeBlock)) { if(!world.setBlockState(blockPos, placeBlock)) {
ConstructionWand.LOGGER.info("Block could not be placed"); ConstructionWand.LOGGER.info("Block could not be placed");
return false; return false;
} }
// Remove block if placeEvent is canceled
BlockSnapshot snapshot = BlockSnapshot.create(world.func_234923_W_(), world, blockPos);
BlockEvent.EntityPlaceEvent placeEvent = new BlockEvent.EntityPlaceEvent(snapshot, placeBlock, player);
MinecraftForge.EVENT_BUS.post(placeEvent);
if(placeEvent.isCanceled()) {
world.removeBlock(blockPos, false);
return false;
}
// Update stats // Update stats
player.addStat(Stats.ITEM_USED.get(placeSnapshot.item)); player.addStat(Stats.ITEM_USED.get(placeSnapshot.item));
player.addStat(ModStats.USE_WAND); player.addStat(ModStats.USE_WAND);
@ -342,10 +339,9 @@ public abstract class WandJob
} }
placeSnapshots = placed; placeSnapshots = placed;
// Play place sound
if(!placeSnapshots.isEmpty()) { if(!placeSnapshots.isEmpty()) {
SoundType sound = placeSnapshots.getFirst().block.getSoundType(); SoundType sound = placeSnapshots.getFirst().block.getSoundType();
world.playSound(null, WandUtil.playerPos(player), sound.getPlaceSound(), SoundCategory.BLOCKS, sound.volume, sound.pitch); world.playSound(null, player.getPosition(), sound.getPlaceSound(), SoundCategory.BLOCKS, sound.volume, sound.pitch);
} }
// Add to job history for undo // Add to job history for undo

View file

@ -1,13 +1,13 @@
modLoader="javafml" modLoader="javafml"
loaderVersion="[33,)"
license="MIT License" license="MIT License"
loaderVersion="[31,)"
[[mods]] [[mods]]
modId="constructionwand" modId="constructionwand"
version="${file.jarVersion}" version="${file.jarVersion}"
displayName="Construction Wand" displayName="Construction Wand"
displayURL="https://github.com/Theta-Dev/ConstructionWand" #optional displayURL="https://github.com/Theta-Dev/ConstructionWand"
logoFile="logo.png" #optional logoFile="logo.png"
authors="ThetaDev" #optional authors="ThetaDev"
description=''' description='''
Construction Wands make building easier! Construction Wands make building easier!
@ -20,12 +20,12 @@ This is my first minecraft mod. May the odds be ever in your favor.
[[dependencies.constructionwand]] [[dependencies.constructionwand]]
modId="forge" modId="forge"
mandatory=true mandatory=true
versionRange="[33,)" versionRange="[31,)"
ordering="NONE" ordering="NONE"
side="BOTH" side="BOTH"
[[dependencies.constructionwand]] [[dependencies.constructionwand]]
modId="minecraft" modId="minecraft"
mandatory=true mandatory=true
versionRange="[1.16.2, 1.16.3]" versionRange="[1.15.2]"
ordering="NONE" ordering="NONE"
side="BOTH" side="BOTH"