Skip to content
This repository has been archived by the owner on Jan 8, 2023. It is now read-only.

Commit

Permalink
Updated to 1.1.1b
Browse files Browse the repository at this point in the history
Attempted to fix the following: Item duplication bug; Current slot being offset incorrectly when dying; Opening doors; Impossibility to destroy certain blocks in survival;
  • Loading branch information
TCLProject committed Oct 26, 2021
1 parent 4aac44e commit cec4ce3
Show file tree
Hide file tree
Showing 9 changed files with 111 additions and 48 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# The Offhand Mod

The Offhand Mod is a minecraft mod continued from the [Mine&Blade Battlegear 2](https://github.com/Mine-and-blade-admin/Battlegear2) mod for Minecraft Forge 1.7.10 that aims to change it's dual wielding mechanics to add a permanently playable and usable offhand mechanic to the game.
Please do note, that this mod does not perfectly work with multiplayer. It was made with multiplayer in mind, but I most likely have missed something (please do report multiplayer bugs if found).

## Changes

Expand Down
35 changes: 25 additions & 10 deletions src/main/java/mods/battlegear2/BattlemodeHookContainerClass.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import java.util.ArrayList;
import java.util.List;

import static cpw.mods.fml.common.eventhandler.Event.Result.DEFAULT;
import static cpw.mods.fml.common.eventhandler.Event.Result.DENY;

import cpw.mods.fml.common.eventhandler.Event;
import cpw.mods.fml.common.eventhandler.EventPriority;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
Expand Down Expand Up @@ -35,7 +38,15 @@
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemBucket;
import net.minecraft.item.ItemDoor;
import net.minecraft.item.ItemRedstone;
import net.minecraft.item.ItemReed;
import net.minecraft.item.ItemSeedFood;
import net.minecraft.item.ItemSign;
import net.minecraft.item.ItemSkull;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.client.C07PacketPlayerDigging;
import net.minecraft.util.MathHelper;
Expand All @@ -53,11 +64,8 @@
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.tclproject.mysteriumlib.asm.fixes.MysteriumPatchesFixesO;
import net.tclproject.mysteriumlib.network.OFFMagicNetwork;
import net.tclproject.theoffhandmod.TheOffhandMod;
import net.tclproject.theoffhandmod.misc.OffhandEventHandler;
import net.tclproject.theoffhandmod.packets.InteractWithSyncServer;
import net.tclproject.theoffhandmod.packets.OverrideSyncServer;

public final class BattlemodeHookContainerClass {

Expand Down Expand Up @@ -146,9 +154,15 @@ public void playerInteract(PlayerInteractEvent event) {
ItemStack mainHandItem = event.entityPlayer.getCurrentEquippedItem();
ItemStack offhandItem = ((InventoryPlayerBattle) event.entityPlayer.inventory).getCurrentOffhandWeapon();
if (!MysteriumPatchesFixesO.shouldNotOverride) {
event.setCanceled(true);
PlayerInteractEvent.Result blk = event.useBlock;
PlayerInteractEvent.Result itm = event.useItem;
event.useBlock = PlayerInteractEvent.Result.DENY;
MovingObjectPosition mop = getRaytraceBlock(event.entityPlayer);
if (TheOffhandMod.proxy.isRightClickHeld() && !MysteriumPatchesFixesO.leftclicked) {
event.setCanceled(true);
}
if (mop != null) {
event.setCanceled(true);
int
i = mop.blockX,
j = mop.blockY,
Expand All @@ -158,13 +172,10 @@ public void playerInteract(PlayerInteractEvent event) {
float f1 = (float)mop.hitVec.yCoord - j;
float f2 = (float)mop.hitVec.zCoord - k;

if (!event.entityPlayer.isSneaking() && (event.entityPlayer.worldObj.getBlock(i, j, k).onBlockActivated(event.entityPlayer.worldObj, i, j, k, event.entityPlayer, side, f, f1, f2))) {
if (!event.entityPlayer.isSneaking() && !BattlegearUtils.reverseactionconfirmed && OffhandEventHandler.canBlockBeInteractedWith(event.entityPlayer.worldObj, i, j, k)) {
event.setCanceled(false);
if (event.entityPlayer.worldObj.getTileEntity(i, j, k) instanceof IInventory) {
IInventory te = ((IInventory)event.entityPlayer.worldObj.getTileEntity(i, j, k));
te.openInventory();
tobeclosed.add(te);
}
event.useBlock = blk;
event.useItem = itm;
}
}
if (event.entityPlayer.worldObj.isRemote && !(BattlegearUtils.reverseactionconfirmed && BattlegearUtils.usagePriorAttack(offhandItem))) sendOffSwingEvent(event, mainHandItem, offhandItem);
Expand Down Expand Up @@ -192,6 +203,10 @@ public void playerInteract(PlayerInteractEvent event) {
// used in hostwapping the item to dig with, to remember where to return the main slot to
public static int prevOffhandOffset;

public static boolean isItemBlock(Item item) {
return item instanceof ItemBlock || item instanceof ItemDoor || item instanceof ItemSign || item instanceof ItemReed || item instanceof ItemSeedFood || item instanceof ItemRedstone || item instanceof ItemBucket || item instanceof ItemSkull;
}

@SideOnly(Side.CLIENT)
public static void tryBreakBlockOffhand(MovingObjectPosition objectMouseOver, ItemStack offhandItem, ItemStack mainHandItem, PlayerTickEvent event) {
Minecraft mcInstance = Minecraft.getMinecraft();
Expand Down
10 changes: 2 additions & 8 deletions src/main/java/mods/battlegear2/api/core/BattlegearUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,14 @@
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;

import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.EventBus;
import mods.battlegear2.BattlemodeHookContainerClass;
import mods.battlegear2.api.IAllowItem;
import mods.battlegear2.api.IOffhandDual;
import mods.battlegear2.api.IUsableItem;
import mods.battlegear2.api.shield.IShield;
import mods.battlegear2.api.weapons.IBattlegearWeapon;
import mods.battlegear2.api.weapons.WeaponRegistry;
import net.minecraft.client.Minecraft;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
Expand All @@ -28,10 +27,8 @@
import net.minecraft.item.Item;
import net.minecraft.item.Item.ToolMaterial;
import net.minecraft.item.ItemBed;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemBook;
import net.minecraft.item.ItemBow;
import net.minecraft.item.ItemBucket;
import net.minecraft.item.ItemEnderPearl;
import net.minecraft.item.ItemHangingEntity;
import net.minecraft.item.ItemHoe;
Expand All @@ -52,9 +49,6 @@
import net.minecraftforge.event.ForgeEventFactory;
import net.minecraftforge.event.entity.player.AttackEntityEvent;
import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent;
import net.tclproject.mysteriumlib.network.OFFMagicNetwork;
import net.tclproject.theoffhandmod.packets.OverrideSyncServer;
import proxy.client.TOMClientProxy;

/**
* Store commonly used method, mostly for the {@link EntityPlayer} {@link ItemStack}s management
Expand Down Expand Up @@ -229,7 +223,7 @@ else if(itemStack.getItemUseAction()==EnumAction.drink || itemStack.getItemUseAc
* @return true if it is commonly usable
*/
public static boolean isCommonlyUsable(Item item){
return isBow(item) || item.getClass().toString().equalsIgnoreCase("class D.f") || item instanceof ItemBed || item instanceof ItemHangingEntity || item instanceof ItemBook || item instanceof ItemBlock || item instanceof ItemHoe || item instanceof ItemBucket || item instanceof ItemSnowball || item instanceof ItemEnderPearl;
return isBow(item) || item.getClass().toString().equalsIgnoreCase("class D.f") || item instanceof ItemBed || item instanceof ItemHangingEntity || item instanceof ItemBook || BattlemodeHookContainerClass.isItemBlock(item) || item instanceof ItemHoe || item instanceof ItemSnowball || item instanceof ItemEnderPearl;
}
// item instanceof ItemCrossbow || item instanceof ItemMounter || item instanceof ItemTeleporter || item instanceof ItemElementalStaff || item instanceof ItemGun || item instanceof ItemNpcMovingPath || item instanceof ItemMachineGun || item instanceof ItemMusket || item instanceof ItemNpcCloner || item instanceof ItemNpcScripter || item instanceof SpellBase || item instanceof ItemNpcWand || item instanceof ItemShield || item instanceof ItemSlingshot || item instanceof ItemSoulstoneFilled || item instanceof ItemSoulstoneEmpty || item instanceof ItemStaff || item instanceof ItemThrowingWeapon || item instanceof ItemThrowingShuriken

Expand Down
14 changes: 0 additions & 14 deletions src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java
Original file line number Diff line number Diff line change
Expand Up @@ -445,20 +445,6 @@ public int getSizeInventory() {
return this.mainInventory.length + this.armorInventory.length;
}

/**
* Drop all slots content, and clear them
*/
@Override
public void dropAllItems() {
super.dropAllItems();
for (int i = 0; i < this.extraItems.length; ++i) {
if (this.extraItems[i] != null) {
this.player.func_146097_a(this.extraItems[i], true, false);
this.extraItems[i] = null;
}
}
}

/**
* UNUSED in vanilla for players, but let's pretend
* Mark the inventory content as dirty to be send to the client
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.tclproject.mysteriumlib.asm.fixes.MysteriumPatchesFixesO;
import net.tclproject.theoffhandmod.TheOffhandMod;
import net.tclproject.theoffhandmod.misc.OffhandEventHandler;

public final class BattlegearClientTickHandeler {
public static final int FLASH_MAX = 30;
Expand Down Expand Up @@ -175,6 +176,10 @@ public void tickStart(EntityPlayer player) {

@SideOnly(Side.CLIENT)
public void tryCheckUseItem(ItemStack offhand, EntityPlayer player){
MovingObjectPosition mop = BattlemodeHookContainerClass.getRaytraceBlock(player);
if (mop != null && OffhandEventHandler.canBlockBeInteractedWith(player.worldObj, mop.blockX, mop.blockY, mop.blockZ) && BattlegearUtils.reverseactionconfirmed) {
return;
}
if(BattlegearUtils.usagePriorAttack(offhand) && !MysteriumPatchesFixesO.shouldNotOverride){
MovingObjectPosition mouseOver = mc.objectMouseOver;
boolean flag = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ public static void renderItemInFirstPerson(float frame, Minecraft mc, ItemRender
}
if(!BattlegearUtils.RENDER_BUS.post(new PreRenderPlayerElement(preRender, true, PlayerElementType.ItemOffhand, itemToRender))){

if (!Minecraft.getMinecraft().gameSettings.keyBindAttack.getIsKeyPressed() && Minecraft.getMinecraft().gameSettings.keyBindUseItem.getIsKeyPressed() && ItemStack.areItemStacksEqual(((InventoryPlayerBattle)player.inventory).getCurrentOffhandWeapon(), Minecraft.getMinecraft().playerController.currentItemHittingBlock)) {
if (!Minecraft.getMinecraft().gameSettings.keyBindAttack.getIsKeyPressed() && Minecraft.getMinecraft().gameSettings.keyBindUseItem.getIsKeyPressed() && ItemStack.areItemStacksEqual(((InventoryPlayerBattle)player.inventory).getCurrentOffhandWeapon(), Minecraft.getMinecraft().playerController.currentItemHittingBlock) && Minecraft.getMinecraft().playerController.isHittingBlock) {
GL11.glTranslatef(0F, 0.5F, 0F);
if (ItemStack.areItemStacksEqual(((InventoryPlayerBattle)player.inventory).getCurrentOffhandWeapon(), ((InventoryPlayerBattle)player.inventory).getStackInSlot(((InventoryPlayerBattle)player.inventory).currentItem))) {
GL11.glTranslatef(0.6F, -0.4F, 0.3F);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import mods.battlegear2.BattlemodeHookContainerClass;
import mods.battlegear2.api.core.BattlegearTranslator;
import mods.battlegear2.api.core.BattlegearUtils;
import mods.battlegear2.api.core.IBattlePlayer;
import mods.battlegear2.api.core.InventoryPlayerBattle;
Expand All @@ -24,13 +25,19 @@
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Items;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.EnumAction;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.item.ItemTool;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.client.event.MouseEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
Expand Down Expand Up @@ -90,9 +97,9 @@ public void onClick(MouseEvent event)
boolean shouldUndo = false;
int leftclick = reversedAttack() ? 1 : 0;
int rightclick = reversedUse() ? 0 : 1;
if(event.button == leftclick && event.buttonstate && !BattlegearUtils.reverseactionconfirmed && Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem() != null && Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem().getItem() instanceof ItemBlock) {
if(event.button == leftclick && event.buttonstate && !BattlegearUtils.reverseactionconfirmed && Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem() != null && BattlemodeHookContainerClass.isItemBlock(Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem().getItem())) {
MovingObjectPosition mop = BattlemodeHookContainerClass.getRaytraceBlock(Minecraft.getMinecraft().thePlayer);
if (mop != null) {
if (mop != null && !canBlockBeInteractedWith(Minecraft.getMinecraft().theWorld, mop.blockX, mop.blockY, mop.blockZ)) {
cancelone=true;
boolean reversedIt = false;
if (!MysteriumPatchesFixesO.shouldNotOverride) reversedIt = true;
Expand Down Expand Up @@ -159,25 +166,22 @@ public void onUpdatePlayer(TickEvent.PlayerTickEvent event)
ItemStack mainHandItem = event.player.getCurrentEquippedItem();
ItemStack offhandItem = ((InventoryPlayerBattle) event.player.inventory).getCurrentOffhandWeapon();
MovingObjectPosition mop = BattlemodeHookContainerClass.getRaytraceBlock(event.player);
if (offhandItem != null && offhandItem.getItem() instanceof ItemBlock) {
if (offhandItem != null && BattlemodeHookContainerClass.isItemBlock(offhandItem.getItem())) {
if (!BattlegearUtils.usagePriorAttack(offhandItem) && mop != null) {
BattlemodeHookContainerClass.tryBreakBlockOffhand(mop, offhandItem, mainHandItem, event);
TheOffhandMod.proxy.setLeftClickCounter(10);
} else {
Minecraft.getMinecraft().playerController.resetBlockRemoving();
}
} else {
System.out.println(mop);
System.out.println(Minecraft.getMinecraft());
System.out.println(Minecraft.getMinecraft().playerController);
if (mop != null && (!Minecraft.getMinecraft().playerController.onPlayerRightClick(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().theWorld, offhandItem, mop.blockX, mop.blockY, mop.blockZ, mop.sideHit, mop.hitVec) || BattlegearUtils.reverseactionconfirmed)) {
if (mop != null && (!BattlegearUtils.usagePriorAttack(offhandItem) || BattlegearUtils.reverseactionconfirmed) && (!canBlockBeInteractedWith(Minecraft.getMinecraft().theWorld, mop.blockX, mop.blockY, mop.blockZ) || BattlegearUtils.reverseactionconfirmed)) {
BattlemodeHookContainerClass.tryBreakBlockOffhand(mop, offhandItem, mainHandItem, event);
TheOffhandMod.proxy.setLeftClickCounter(10);
} else {
Minecraft.getMinecraft().playerController.resetBlockRemoving();
}
}
} else {
} else if (!TheOffhandMod.proxy.isLeftClickHeld()) {
Minecraft.getMinecraft().playerController.resetBlockRemoving();
}
}
Expand Down Expand Up @@ -207,6 +211,47 @@ public void onUpdatePlayer(TickEvent.PlayerTickEvent event)
}
}
}

private static String[] activatedBlockMethodNames = {
BattlegearTranslator.getMapedMethodName("Block", "func_149727_a", "onBlockActivated"),
BattlegearTranslator.getMapedMethodName("Block", "func_149699_a", "onBlockClicked")};
private static Class[][] activatedBlockMethodParams = {
new Class[]{World.class, int.class, int.class, int.class, EntityPlayer.class, int.class, float.class, float.class, float.class},
new Class[]{World.class, int.class, int.class, int.class, EntityPlayer.class}};

@SuppressWarnings("unchecked")
public static boolean canBlockBeInteractedWith(World worldObj, int x, int y, int z) {
if (worldObj == null) return false;
Block block = worldObj.getBlock(x, y, z);
if (block == null) return false;
if (block.getClass().equals(Block.class)) return false;
try {
Class c = block.getClass();
while (!(c.equals(Block.class))) {
try {
try {
c.getDeclaredMethod(activatedBlockMethodNames[0], activatedBlockMethodParams[0]);
return true;
} catch (NoSuchMethodException ignored) {
}

try {
c.getDeclaredMethod(activatedBlockMethodNames[1], activatedBlockMethodParams[1]);
return true;
} catch (NoSuchMethodException ignored) {
}
} catch (NoClassDefFoundError ignored) {

}

c = c.getSuperclass();
}

return false;
} catch (NullPointerException e) {
return true;
}
}

private void onFirstTick(EntityPlayer p) {

Expand All @@ -215,8 +260,12 @@ private void onFirstTick(EntityPlayer p) {
@SubscribeEvent
public void onClonePlayer(Clone event) {
((InventoryPlayerBattle)event.entityPlayer.inventory).clearInventory(null, -1);
event.entityPlayer.inventory.markDirty();
event.entityPlayer.inventoryContainer.detectAndSendChanges();
((InventoryPlayerBattle)event.entityPlayer.inventory).currentItem = 150;
TheOffhandMod.packetHandler.sendPacketToServer(new BattlegearSyncItemPacket(event.entityPlayer).generatePacket());
TheOffhandMod.packetHandler.sendPacketToPlayer(new BattlegearSyncItemPacket(event.entityPlayer).generatePacket(), (EntityPlayerMP)event.entityPlayer);
Minecraft.getMinecraft().playerController.syncCurrentPlayItem();
}

@SideOnly(Side.CLIENT)
Expand Down Expand Up @@ -347,13 +396,16 @@ public void renderHotbarOverlay(RenderGameOverlayEvent event)
Minecraft mc = Minecraft.getMinecraft();

if (Minecraft.getMinecraft().rightClickDelayTimer == 0 && Minecraft.getMinecraft().gameSettings.keyBindAttack.getIsKeyPressed() && !BattlegearUtils.reverseactionconfirmed && Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem() != null && Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem().getItem() instanceof ItemBlock) { // places blocks continuously if left click is held with block in hand
boolean reversedIt = false;
if (!MysteriumPatchesFixesO.shouldNotOverride) reversedIt = true;
MysteriumPatchesFixesO.shouldNotOverride = true;
OFFMagicNetwork.dispatcher.sendToServer(new OverrideSyncServer(Minecraft.getMinecraft().thePlayer));
mc.func_147121_ag();
if (reversedIt) MysteriumPatchesFixesO.shouldNotOverride = false;
OFFMagicNetwork.dispatcher.sendToServer(new OverrideSyncServer(Minecraft.getMinecraft().thePlayer));
MovingObjectPosition mop = BattlemodeHookContainerClass.getRaytraceBlock(Minecraft.getMinecraft().thePlayer);
if (mop != null && !canBlockBeInteractedWith(Minecraft.getMinecraft().theWorld, mop.blockX, mop.blockY, mop.blockZ)) {
boolean reversedIt = false;
if (!MysteriumPatchesFixesO.shouldNotOverride) reversedIt = true;
MysteriumPatchesFixesO.shouldNotOverride = true;
OFFMagicNetwork.dispatcher.sendToServer(new OverrideSyncServer(Minecraft.getMinecraft().thePlayer));
mc.func_147121_ag();
if (reversedIt) MysteriumPatchesFixesO.shouldNotOverride = false;
OFFMagicNetwork.dispatcher.sendToServer(new OverrideSyncServer(Minecraft.getMinecraft().thePlayer));
}
}

if (!((IBattlePlayer) mc.thePlayer).isBattlemode()) {
Expand Down
Loading

0 comments on commit cec4ce3

Please sign in to comment.