diff options
author | madmaxoft <github@xoft.cz> | 2013-08-30 14:24:03 +0200 |
---|---|---|
committer | madmaxoft <github@xoft.cz> | 2013-08-30 14:24:03 +0200 |
commit | 17ad4c2610f2c33d5b4a8b42b7d4b8fbda9ade32 (patch) | |
tree | feaaf5bf652bfdc542dee9b9c452391531aee6ba /source/Items/ItemBow.h | |
parent | Implemented basic physics for projectiles. (diff) | |
download | cuberite-17ad4c2610f2c33d5b4a8b42b7d4b8fbda9ade32.tar cuberite-17ad4c2610f2c33d5b4a8b42b7d4b8fbda9ade32.tar.gz cuberite-17ad4c2610f2c33d5b4a8b42b7d4b8fbda9ade32.tar.bz2 cuberite-17ad4c2610f2c33d5b4a8b42b7d4b8fbda9ade32.tar.lz cuberite-17ad4c2610f2c33d5b4a8b42b7d4b8fbda9ade32.tar.xz cuberite-17ad4c2610f2c33d5b4a8b42b7d4b8fbda9ade32.tar.zst cuberite-17ad4c2610f2c33d5b4a8b42b7d4b8fbda9ade32.zip |
Diffstat (limited to '')
-rw-r--r-- | source/Items/ItemBow.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/source/Items/ItemBow.h b/source/Items/ItemBow.h new file mode 100644 index 000000000..845192ef7 --- /dev/null +++ b/source/Items/ItemBow.h @@ -0,0 +1,80 @@ + +// ItemBow.h + +// Declares the cItemBowHandler class representing the itemhandler for bows + + + + + +#pragma once + +#include "../Entities/ProjectileEntity.h" + + + + + +class cItemBowHandler : + public cItemHandler +{ + typedef cItemHandler super; + +public: + cItemBowHandler(void) : + super(E_ITEM_BOW) + { + } + + + virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Dir) override + { + ASSERT(a_Player != NULL); + + // Check if the player has an arrow in the inventory, or is in Creative: + if (!(a_Player->IsGameModeCreative() || a_Player->GetInventory().HasItems(cItem(E_ITEM_ARROW)))) + { + return false; + } + a_Player->StartChargingBow(); + return true; + } + + + virtual void OnItemShoot(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace) override + { + // Actual shot - produce the arrow with speed based on the ticks that the bow was charged + ASSERT(a_Player != NULL); + + int BowCharge = a_Player->FinishChargingBow(); + double Force = (double)BowCharge / 20; + Force = (Force * Force + 2 * Force) / 3; // This formula is used by the 1.6.2 client + if (Force < 0.1) + { + // Too little force, ignore the shot + return; + } + if (Force > 1) + { + Force = 1; + } + + // Create the arrow entity: + cArrowEntity * Arrow = new cArrowEntity(*a_Player, Force * 2); + if (Arrow == NULL) + { + return; + } + if (!Arrow->Initialize(a_Player->GetWorld())) + { + delete Arrow; + return; + } + a_Player->GetWorld()->BroadcastSpawnEntity(*Arrow); + } +} ; + + + + + |