2012-12-24 17:09:01 -05:00
|
|
|
|
2012-06-14 09:06:06 -04:00
|
|
|
#pragma once
|
|
|
|
|
2014-03-09 14:47:22 -04:00
|
|
|
#include <limits>
|
2014-05-09 17:43:00 -04:00
|
|
|
#include <cmath>
|
2014-02-03 17:46:56 -05:00
|
|
|
|
2013-05-30 04:40:13 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2015-07-31 10:49:10 -04:00
|
|
|
/** List of slot numbers, used for inventory-painting */
|
2013-05-30 04:40:13 -04:00
|
|
|
typedef std::vector<int> cSlotNums;
|
|
|
|
|
|
|
|
|
2013-05-08 05:45:07 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-01-11 23:46:01 -05:00
|
|
|
// tolua_begin
|
|
|
|
|
2015-07-31 10:49:10 -04:00
|
|
|
/** Experience Orb setup */
|
2013-11-13 12:25:47 -05:00
|
|
|
enum
|
|
|
|
{
|
2014-07-17 13:13:23 -04:00
|
|
|
// Open to suggestion on naming convention here :)
|
2013-11-13 12:25:47 -05:00
|
|
|
MAX_EXPERIENCE_ORB_SIZE = 2000
|
|
|
|
} ;
|
2013-11-13 08:50:47 -05:00
|
|
|
|
2012-06-14 09:06:06 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-06-17 09:21:20 -04:00
|
|
|
/** Block face constants, used in PlayerDigging and PlayerBlockPlacement packets and bbox collision calc */
|
2013-09-01 13:05:58 -04:00
|
|
|
enum eBlockFace
|
2012-08-10 16:42:59 -04:00
|
|
|
{
|
2013-09-01 13:05:58 -04:00
|
|
|
BLOCK_FACE_NONE = -1, // Interacting with no block face - swinging the item in the air
|
2015-06-17 09:21:20 -04:00
|
|
|
BLOCK_FACE_XM = 4, // Interacting with the X- face of the block
|
|
|
|
BLOCK_FACE_XP = 5, // Interacting with the X+ face of the block
|
|
|
|
BLOCK_FACE_YM = 0, // Interacting with the Y- face of the block
|
|
|
|
BLOCK_FACE_YP = 1, // Interacting with the Y+ face of the block
|
|
|
|
BLOCK_FACE_ZM = 2, // Interacting with the Z- face of the block
|
|
|
|
BLOCK_FACE_ZP = 3, // Interacting with the Z+ face of the block
|
2014-10-11 22:39:55 -04:00
|
|
|
|
2013-09-01 13:05:58 -04:00
|
|
|
// Synonyms using the (deprecated) world directions:
|
|
|
|
BLOCK_FACE_BOTTOM = BLOCK_FACE_YM, // Interacting with the bottom face of the block
|
|
|
|
BLOCK_FACE_TOP = BLOCK_FACE_YP, // Interacting with the top face of the block
|
2013-11-16 15:58:17 -05:00
|
|
|
BLOCK_FACE_NORTH = BLOCK_FACE_ZM, // Interacting with the northern face of the block
|
|
|
|
BLOCK_FACE_SOUTH = BLOCK_FACE_ZP, // Interacting with the southern face of the block
|
|
|
|
BLOCK_FACE_WEST = BLOCK_FACE_XM, // Interacting with the western face of the block
|
|
|
|
BLOCK_FACE_EAST = BLOCK_FACE_XP, // Interacting with the eastern face of the block
|
2015-06-17 09:21:20 -04:00
|
|
|
|
|
|
|
// Bounds, used for range-checking:
|
|
|
|
BLOCK_FACE_MIN = -1,
|
|
|
|
BLOCK_FACE_MAX = 5,
|
2012-08-18 05:56:28 -04:00
|
|
|
} ;
|
|
|
|
|
2013-05-08 05:45:07 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-07-31 10:49:10 -04:00
|
|
|
/** PlayerDigging status constants */
|
2012-08-18 05:56:28 -04:00
|
|
|
enum
|
|
|
|
{
|
1.9 / 1.9.2 / 1.9.3 / 1.9.4 protocol support (#3135)
* Semistable update to 15w31a
I'm going through snapshots in a sequential order since it should make things easier, and since protocol version history is written.
* Update to 15w34b protocol
Also, fix an issue with the Entity Equipment packet from the past version. Clients are able to connect and do stuff!
* Partially update to 15w35e
Chunk data doesn't work, but the client joins. I'm waiting to do chunk data because chunk data has an incomplete format until 15w36d.
* Add '/blk' debug command
This command lets one see what block they are looking at, and makes figuring out what's supposed to be where in a highly broken chunk possible.
* Fix CRLF normalization in CheckBasicStyle.lua
Normally, this doesn't cause an issue, but when running from cygwin, it detects the CR as whitespace and creates thousands of violations for every single line. Lua, when run on windows, will normalize automatically, but when run via cygwin, it won't.
The bug was simply that gsub was returning a replaced version, but not changing the parameter, so the replaced version was ignored.
* Update to 15w40b
This includes chunk serialization. Fully functional chunk serialization for 1.9.
I'm not completely happy with the chunk serialization as-is (correct use of palettes would be great), but cuberite also doesn't skip sending empty chunks so this performance optimization should probably come later. The creation of a full buffer is suboptimal, but it's the easiest way to implement this code.
* Write long-by-long rather than creating a buffer
This is a bit faster and should be equivalent. However, the code still doesn't look too good.
* Update to 15w41a protocol
This includes the new set passengers packet, which works off of the ridden entity, not the rider. That means, among other things, that information about the previously ridden vehicle is needed when detaching. So a new method with that info was added.
* Update to 15w45a
* 15w51b protocol
* Update to 1.9.0 protocol
Closes #3067. There are still a few things that need to be worked out (picking up items, effects, particles, and most importantly inventory), but in general this should work. I'll make a few more changes tomorrow to get the rest of the protocol set up, along with 1.9.1/1.9.2 (which did make a few changes). Chunks, however, _are_ working, along with most other parts of the game (placing/breaking blocks).
* Fix item pickup packet not working
That was a silly mistake, but at least it was an easy one.
* 1.9.2 protocol support
* Fix version info found in server list ping
Thus, the client reports that it can connect rather than saying that the server is out of date. This required creating separate classes for 1.9.1 and 1.9.2, unfortunately.
* Fix build errors generated by clang
These didn't happen in MSVC.
* Add protocol19x.cpp and protocol19x.h to CMakeLists
* Ignore warnings in protocol19x that are ignored in protocol18x
* Document BLOCK_FACE and DIG_STATUS constants
* Fix BLOCK_FACE links and add separate section for DIG_STATUS
* Fix bat animation and object spawning
The causes of both of these are explained in #3135, but the gist is that both were typos.
* Implement Use Item packet
This means that buckets, bows, fishing rods, and several other similar items now work when not looking at a block.
* Handle DIG_STATUS_SWAP_ITEM_IN_HAND
* Add support for spawn eggs and potions
The items are transformed from the 1.9 version to the 1.8 version when reading and transformed back when sending.
* Remove spammy potion debug logging
* Fix wolf collar color metadata
The wrong type was being used, causing several clientside issues (including the screen going black).
* Fix 1.9 chunk sending in the nether
The nether and the end don't send skylight.
* Fix clang build errors
* Fix water bottles becoming mundane potions
This happened because the can become splash potion bit got set incorrectly. Water bottles and mundane potions are only differentiated by the fact that water bottles have a metadata of 0, so setting that bit made it a mundane potion.
Also add missing break statements to the read item NBT switch, which would otherwise break items with custom names and also cause incorrect "Unimplemented NBT data when parsing!" logging.
* Copy Protocol18x as Protocol19x
Aditionally, method and class names have been swapped to clean up other diffs. This commit is only added to make the following diffs more readable; it doesn't make any other changes (beyond class names).
* Make thrown potions use the correct appearence
This was caused by potions now using metadata.
* Add missing api doc for cSplashPotionEntity::GetItem
* Fix compile error in SplashPotionEntity.cpp
* Fix fix of cSplashPotionEntity API doc
* Temporarilly disable fall damage particles
These were causing issues in 1.9 due to the changed effect ID.
* Properly send a kick packet when connecting with an invalid version
This means that the client no longer waits on the server screen with no indication whatsoever. However, right now the server list ping isn't implemented for unknown versions, so it'll only load "Old" on the ping.
I also added a GetVarIntSize method to cByteBuffer. This helps clean up part of the code here (and I think it could clean up other parts), but it may make sense for it to be moved elsewhere (or declared in a different way).
* Handle server list pings from unrecognized versions
This isn't the cleanest way of writing it (it feels odd to use ProtocolRecognizer to send packets, and the addition of m_InPingForUnrecognizedVersion feels like the wrong technique), but it works and I can't think of a better way (apart from creating a full separate protocol class to handle only the ping... which would be worse).
* Use cPacketizer for the disconnect packet
This also should fix clang build errors.
* Add 1.9.3 / 1.9.4 support
* Fix incorrect indentation in APIDesc
2016-05-14 15:12:42 -04:00
|
|
|
DIG_STATUS_STARTED = 0,
|
|
|
|
DIG_STATUS_CANCELLED = 1,
|
|
|
|
DIG_STATUS_FINISHED = 2,
|
|
|
|
DIG_STATUS_DROP_STACK = 3,
|
|
|
|
DIG_STATUS_DROP_HELD = 4,
|
|
|
|
DIG_STATUS_SHOOT_EAT = 5,
|
|
|
|
DIG_STATUS_SWAP_ITEM_IN_HAND = 6,
|
2012-08-10 16:42:59 -04:00
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-07-31 10:49:10 -04:00
|
|
|
/** Individual actions sent in the WindowClick packet */
|
2013-05-08 05:45:07 -04:00
|
|
|
enum eClickAction
|
|
|
|
{
|
|
|
|
// Sorted by occurrence in the 1.5 protocol
|
|
|
|
caLeftClick,
|
|
|
|
caRightClick,
|
|
|
|
caShiftLeftClick,
|
|
|
|
caShiftRightClick,
|
|
|
|
caNumber1,
|
|
|
|
caNumber2,
|
|
|
|
caNumber3,
|
|
|
|
caNumber4,
|
|
|
|
caNumber5,
|
|
|
|
caNumber6,
|
|
|
|
caNumber7,
|
|
|
|
caNumber8,
|
|
|
|
caNumber9,
|
|
|
|
caMiddleClick,
|
|
|
|
caDropKey,
|
|
|
|
caCtrlDropKey,
|
|
|
|
caLeftClickOutside,
|
|
|
|
caRightClickOutside,
|
|
|
|
caLeftClickOutsideHoldNothing,
|
|
|
|
caRightClickOutsideHoldNothing,
|
|
|
|
caLeftPaintBegin,
|
|
|
|
caRightPaintBegin,
|
|
|
|
caLeftPaintProgress,
|
|
|
|
caRightPaintProgress,
|
|
|
|
caLeftPaintEnd,
|
|
|
|
caRightPaintEnd,
|
|
|
|
caDblClick,
|
|
|
|
// Add new actions here
|
|
|
|
caUnknown = 255,
|
2014-10-11 22:39:55 -04:00
|
|
|
|
2013-05-08 05:45:07 -04:00
|
|
|
// Keep this list in sync with ClickActionToString() function below!
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum eGameMode
|
|
|
|
{
|
|
|
|
eGameMode_NotSet = -1,
|
|
|
|
eGameMode_Survival = 0,
|
|
|
|
eGameMode_Creative = 1,
|
|
|
|
eGameMode_Adventure = 2,
|
2014-09-16 14:01:04 -04:00
|
|
|
eGameMode_Spectator = 3,
|
2014-10-11 22:39:55 -04:00
|
|
|
|
2013-05-08 05:45:07 -04:00
|
|
|
// Easier-to-use synonyms:
|
|
|
|
gmNotSet = eGameMode_NotSet,
|
|
|
|
gmSurvival = eGameMode_Survival,
|
|
|
|
gmCreative = eGameMode_Creative,
|
|
|
|
gmAdventure = eGameMode_Adventure,
|
2014-09-16 14:01:04 -04:00
|
|
|
gmSpectator = eGameMode_Spectator,
|
2014-10-11 22:39:55 -04:00
|
|
|
|
2013-07-28 16:55:09 -04:00
|
|
|
// These two are used to check GameMode for validity when converting from integers.
|
|
|
|
gmMax, // Gets automatically assigned
|
|
|
|
gmMin = 0,
|
2013-05-08 05:45:07 -04:00
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-06-02 13:59:46 -04:00
|
|
|
enum eChatType
|
|
|
|
{
|
|
|
|
ctChatBox = 0,
|
|
|
|
ctSystem = 1,
|
|
|
|
ctAboveActionBar = 2,
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-05-08 05:45:07 -04:00
|
|
|
enum eWeather
|
|
|
|
{
|
|
|
|
eWeather_Sunny = 0,
|
|
|
|
eWeather_Rain = 1,
|
|
|
|
eWeather_ThunderStorm = 2,
|
2014-10-11 22:39:55 -04:00
|
|
|
|
2013-05-08 05:45:07 -04:00
|
|
|
// Easier-to-use synonyms:
|
|
|
|
wSunny = eWeather_Sunny,
|
|
|
|
wRain = eWeather_Rain,
|
|
|
|
wThunderstorm = eWeather_ThunderStorm,
|
|
|
|
wStorm = wThunderstorm,
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-02-19 08:45:09 -05:00
|
|
|
enum eMobHeadType
|
2014-02-17 14:14:08 -05:00
|
|
|
{
|
|
|
|
SKULL_TYPE_SKELETON = 0,
|
|
|
|
SKULL_TYPE_WITHER = 1,
|
|
|
|
SKULL_TYPE_ZOMBIE = 2,
|
|
|
|
SKULL_TYPE_PLAYER = 3,
|
|
|
|
SKULL_TYPE_CREEPER = 4,
|
2017-02-14 05:13:55 -05:00
|
|
|
SKULL_TYPE_DRAGON = 5,
|
2014-02-17 14:14:08 -05:00
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-02-19 08:45:09 -05:00
|
|
|
enum eMobHeadRotation
|
2014-02-17 14:14:08 -05:00
|
|
|
{
|
|
|
|
SKULL_ROTATION_NORTH = 0,
|
|
|
|
SKULL_ROTATION_NORTH_NORTH_EAST = 1,
|
|
|
|
SKULL_ROTATION_NORTH_EAST = 2,
|
|
|
|
SKULL_ROTATION_EAST_NORTH_EAST = 3,
|
|
|
|
SKULL_ROTATION_EAST = 4,
|
|
|
|
SKULL_ROTATION_EAST_SOUTH_EAST = 5,
|
|
|
|
SKULL_ROTATION_SOUTH_EAST = 6,
|
|
|
|
SKULL_ROTATION_SOUTH_SOUTH_EAST = 7,
|
|
|
|
SKULL_ROTATION_SOUTH = 8,
|
|
|
|
SKULL_ROTATION_SOUTH_SOUTH_WEST = 9,
|
|
|
|
SKULL_ROTATION_SOUTH_WEST = 10,
|
|
|
|
SKULL_ROTATION_WEST_SOUTH_WEST = 11,
|
|
|
|
SKULL_ROTATION_WEST = 12,
|
|
|
|
SKULL_ROTATION_WEST_NORTH_WEST = 13,
|
|
|
|
SKULL_ROTATION_NORTH_WEST = 14,
|
|
|
|
SKULL_ROTATION_NORTH_NORTH_WEST = 15,
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-01-03 15:19:29 -05:00
|
|
|
enum eHand
|
|
|
|
{
|
|
|
|
hMain = 0,
|
|
|
|
hOff = 1,
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum eMainHand
|
|
|
|
{
|
|
|
|
mhLeft = 0,
|
|
|
|
mhRight = 1,
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum eSkinPart
|
|
|
|
{
|
|
|
|
spCape = 0x01,
|
|
|
|
spJacket = 0x02,
|
|
|
|
spLeftSleeve = 0x04,
|
|
|
|
spRightSleeve = 0x08,
|
|
|
|
spLeftPants = 0x10,
|
|
|
|
spRightPants = 0x20,
|
|
|
|
spHat = 0x40,
|
|
|
|
spMask = 0x7F,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-08-02 07:12:34 -04:00
|
|
|
inline const char * ClickActionToString(int a_ClickAction)
|
2013-05-08 05:45:07 -04:00
|
|
|
{
|
|
|
|
switch (a_ClickAction)
|
|
|
|
{
|
|
|
|
case caLeftClick: return "caLeftClick";
|
|
|
|
case caRightClick: return "caRightClick";
|
|
|
|
case caShiftLeftClick: return "caShiftLeftClick";
|
|
|
|
case caShiftRightClick: return "caShiftRightClick";
|
|
|
|
case caNumber1: return "caNumber1";
|
|
|
|
case caNumber2: return "caNumber2";
|
|
|
|
case caNumber3: return "caNumber3";
|
|
|
|
case caNumber4: return "caNumber4";
|
|
|
|
case caNumber5: return "caNumber5";
|
|
|
|
case caNumber6: return "caNumber6";
|
|
|
|
case caNumber7: return "caNumber7";
|
|
|
|
case caNumber8: return "caNumber8";
|
|
|
|
case caNumber9: return "caNumber9";
|
|
|
|
case caMiddleClick: return "caMiddleClick";
|
|
|
|
case caDropKey: return "caDropKey";
|
|
|
|
case caCtrlDropKey: return "caCtrlDropKey";
|
|
|
|
case caLeftClickOutside: return "caLeftClickOutside";
|
|
|
|
case caRightClickOutside: return "caRightClickOutside";
|
|
|
|
case caLeftClickOutsideHoldNothing: return "caLeftClickOutsideHoldNothing";
|
|
|
|
case caRightClickOutsideHoldNothing: return "caRightClickOutsideHoldNothing";
|
|
|
|
case caLeftPaintBegin: return "caLeftPaintBegin";
|
|
|
|
case caRightPaintBegin: return "caRightPaintBegin";
|
|
|
|
case caLeftPaintProgress: return "caLeftPaintProgress";
|
|
|
|
case caRightPaintProgress: return "caRightPaintProgress";
|
|
|
|
case caLeftPaintEnd: return "caLeftPaintEnd";
|
|
|
|
case caRightPaintEnd: return "caRightPaintEnd";
|
|
|
|
case caDblClick: return "caDblClick";
|
2014-10-11 22:39:55 -04:00
|
|
|
|
2013-05-08 05:45:07 -04:00
|
|
|
case caUnknown: return "caUnknown";
|
|
|
|
}
|
|
|
|
ASSERT(!"Unknown click action");
|
|
|
|
return "caUnknown";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-05-09 03:25:09 -04:00
|
|
|
/** Returns a blockface mirrored around the Y axis (doesn't change up / down). */
|
2014-03-02 10:05:39 -05:00
|
|
|
inline eBlockFace MirrorBlockFaceY(eBlockFace a_BlockFace)
|
|
|
|
{
|
|
|
|
switch (a_BlockFace)
|
|
|
|
{
|
|
|
|
case BLOCK_FACE_XM: return BLOCK_FACE_XP;
|
|
|
|
case BLOCK_FACE_XP: return BLOCK_FACE_XM;
|
|
|
|
case BLOCK_FACE_ZM: return BLOCK_FACE_ZP;
|
|
|
|
case BLOCK_FACE_ZP: return BLOCK_FACE_ZM;
|
2015-05-19 06:50:59 -04:00
|
|
|
case BLOCK_FACE_NONE:
|
|
|
|
case BLOCK_FACE_YM:
|
|
|
|
case BLOCK_FACE_YP:
|
2015-05-24 09:58:24 -04:00
|
|
|
{
|
2015-05-19 06:50:59 -04:00
|
|
|
return a_BlockFace;
|
2015-05-24 09:58:24 -04:00
|
|
|
};
|
2014-03-02 10:05:39 -05:00
|
|
|
}
|
2015-06-02 06:51:43 -04:00
|
|
|
#if !defined(__clang__)
|
|
|
|
ASSERT(!"Unknown BLOCK_FACE");
|
|
|
|
return a_BlockFace;
|
|
|
|
#endif
|
2014-03-02 10:05:39 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Returns a blockface rotated around the Y axis counter-clockwise. */
|
|
|
|
inline eBlockFace RotateBlockFaceCCW(eBlockFace a_BlockFace)
|
|
|
|
{
|
|
|
|
switch (a_BlockFace)
|
|
|
|
{
|
2015-05-24 10:25:52 -04:00
|
|
|
case BLOCK_FACE_XM: return BLOCK_FACE_ZP;
|
|
|
|
case BLOCK_FACE_XP: return BLOCK_FACE_ZM;
|
|
|
|
case BLOCK_FACE_ZM: return BLOCK_FACE_XM;
|
|
|
|
case BLOCK_FACE_ZP: return BLOCK_FACE_XP;
|
2015-05-19 06:50:59 -04:00
|
|
|
case BLOCK_FACE_NONE:
|
|
|
|
case BLOCK_FACE_YM:
|
|
|
|
case BLOCK_FACE_YP:
|
2015-05-24 09:58:24 -04:00
|
|
|
{
|
2015-05-19 06:50:59 -04:00
|
|
|
return a_BlockFace;
|
2015-05-24 09:58:24 -04:00
|
|
|
}
|
2014-03-02 10:05:39 -05:00
|
|
|
}
|
2015-06-02 06:51:43 -04:00
|
|
|
#if !defined(__clang__)
|
|
|
|
ASSERT(!"Unknown BLOCK_FACE");
|
|
|
|
return a_BlockFace;
|
|
|
|
#endif
|
2014-03-02 10:05:39 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline eBlockFace RotateBlockFaceCW(eBlockFace a_BlockFace)
|
|
|
|
{
|
|
|
|
switch (a_BlockFace)
|
|
|
|
{
|
|
|
|
case BLOCK_FACE_XM: return BLOCK_FACE_ZM;
|
|
|
|
case BLOCK_FACE_XP: return BLOCK_FACE_ZP;
|
|
|
|
case BLOCK_FACE_ZM: return BLOCK_FACE_XP;
|
|
|
|
case BLOCK_FACE_ZP: return BLOCK_FACE_XM;
|
2015-05-19 06:50:59 -04:00
|
|
|
case BLOCK_FACE_NONE:
|
|
|
|
case BLOCK_FACE_YM:
|
|
|
|
case BLOCK_FACE_YP:
|
2015-05-24 09:58:24 -04:00
|
|
|
{
|
2015-05-19 06:50:59 -04:00
|
|
|
return a_BlockFace;
|
2015-05-24 09:58:24 -04:00
|
|
|
};
|
2014-03-02 10:05:39 -05:00
|
|
|
}
|
2015-06-02 06:51:43 -04:00
|
|
|
#if !defined(__clang__)
|
|
|
|
ASSERT(!"Unknown BLOCK_FACE");
|
|
|
|
return a_BlockFace;
|
|
|
|
#endif
|
2014-03-02 10:05:39 -05:00
|
|
|
}
|
|
|
|
|
2015-06-02 06:51:43 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-06-16 12:55:58 -04:00
|
|
|
inline eBlockFace ReverseBlockFace(eBlockFace a_BlockFace)
|
|
|
|
{
|
|
|
|
switch (a_BlockFace)
|
|
|
|
{
|
2015-05-24 10:25:52 -04:00
|
|
|
case BLOCK_FACE_YP: return BLOCK_FACE_YM;
|
|
|
|
case BLOCK_FACE_XP: return BLOCK_FACE_XM;
|
|
|
|
case BLOCK_FACE_ZP: return BLOCK_FACE_ZM;
|
|
|
|
case BLOCK_FACE_YM: return BLOCK_FACE_YP;
|
|
|
|
case BLOCK_FACE_XM: return BLOCK_FACE_XP;
|
|
|
|
case BLOCK_FACE_ZM: return BLOCK_FACE_ZP;
|
2015-05-19 06:50:59 -04:00
|
|
|
case BLOCK_FACE_NONE: return a_BlockFace;
|
2014-06-16 12:55:58 -04:00
|
|
|
}
|
2015-06-02 06:51:43 -04:00
|
|
|
#if !defined(__clang__)
|
|
|
|
ASSERT(!"Unknown BLOCK_FACE");
|
|
|
|
return a_BlockFace;
|
|
|
|
#endif
|
2014-06-16 12:55:58 -04:00
|
|
|
}
|
2014-03-02 10:05:39 -05:00
|
|
|
|
|
|
|
|
2015-06-02 06:51:43 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
2014-03-09 05:05:30 -04:00
|
|
|
/** Returns the textual representation of the BlockFace constant. */
|
|
|
|
inline AString BlockFaceToString(eBlockFace a_BlockFace)
|
|
|
|
{
|
|
|
|
switch (a_BlockFace)
|
|
|
|
{
|
|
|
|
case BLOCK_FACE_XM: return "BLOCK_FACE_XM";
|
|
|
|
case BLOCK_FACE_XP: return "BLOCK_FACE_XP";
|
|
|
|
case BLOCK_FACE_YM: return "BLOCK_FACE_YM";
|
|
|
|
case BLOCK_FACE_YP: return "BLOCK_FACE_YP";
|
|
|
|
case BLOCK_FACE_ZM: return "BLOCK_FACE_ZM";
|
|
|
|
case BLOCK_FACE_ZP: return "BLOCK_FACE_ZP";
|
|
|
|
case BLOCK_FACE_NONE: return "BLOCK_FACE_NONE";
|
|
|
|
}
|
2014-03-19 15:06:12 -04:00
|
|
|
// clang optimisises this line away then warns that it has done so.
|
|
|
|
#if !defined(__clang__)
|
2015-06-02 06:51:43 -04:00
|
|
|
return Printf("Unknown BLOCK_FACE: %d", a_BlockFace);
|
2014-03-19 15:06:12 -04:00
|
|
|
#endif
|
2014-03-09 05:05:30 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-05-08 05:45:07 -04:00
|
|
|
inline bool IsValidBlock(int a_BlockType)
|
|
|
|
{
|
2013-01-11 23:46:01 -05:00
|
|
|
if (
|
2016-11-06 13:30:19 -05:00
|
|
|
(
|
2013-01-11 23:46:01 -05:00
|
|
|
(a_BlockType > -1) &&
|
2013-08-16 06:23:24 -04:00
|
|
|
(a_BlockType <= E_BLOCK_MAX_TYPE_ID)
|
2016-11-06 13:30:19 -05:00
|
|
|
) ||
|
|
|
|
(a_BlockType == 255) // the blocks 235-254 don't exist yet -> http://minecraft.gamepedia.com/Data_values#Block_IDs
|
2013-01-11 23:46:01 -05:00
|
|
|
)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2013-05-08 05:45:07 -04:00
|
|
|
}
|
2012-06-14 09:06:06 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-05-08 05:45:07 -04:00
|
|
|
inline bool IsValidItem(int a_ItemType)
|
|
|
|
{
|
2013-01-11 23:46:01 -05:00
|
|
|
if (
|
|
|
|
((a_ItemType >= E_ITEM_FIRST) && (a_ItemType <= E_ITEM_MAX_CONSECUTIVE_TYPE_ID)) || // Basic items range
|
|
|
|
((a_ItemType >= E_ITEM_FIRST_DISC) && (a_ItemType <= E_ITEM_LAST_DISC)) // Music discs' special range
|
|
|
|
)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-01-11 23:46:01 -05:00
|
|
|
if (a_ItemType == 0)
|
|
|
|
{
|
2012-06-14 09:06:06 -04:00
|
|
|
return false;
|
2013-01-11 23:46:01 -05:00
|
|
|
}
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2013-01-11 23:46:01 -05:00
|
|
|
return IsValidBlock(a_ItemType);
|
2013-05-08 05:45:07 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// tolua_end
|
2012-06-14 09:06:06 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-02-02 16:48:21 -05:00
|
|
|
inline bool IsBlockWater(BLOCKTYPE a_BlockType)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2014-02-02 16:48:21 -05:00
|
|
|
return ((a_BlockType == E_BLOCK_WATER) || (a_BlockType == E_BLOCK_STATIONARY_WATER));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-02-14 05:13:55 -05:00
|
|
|
inline bool IsBlockIce(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
switch (a_BlockType)
|
|
|
|
{
|
|
|
|
case E_BLOCK_ICE:
|
|
|
|
case E_BLOCK_PACKED_ICE:
|
|
|
|
case E_BLOCK_FROSTED_ICE:
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-02-02 16:48:21 -05:00
|
|
|
inline bool IsBlockWaterOrIce(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
2017-02-14 05:13:55 -05:00
|
|
|
return (IsBlockWater(a_BlockType) || IsBlockIce(a_BlockType));
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-10-03 04:52:11 -04:00
|
|
|
inline bool IsBlockLava(BLOCKTYPE a_BlockType)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-01-11 23:46:01 -05:00
|
|
|
return ((a_BlockType == E_BLOCK_LAVA) || (a_BlockType == E_BLOCK_STATIONARY_LAVA));
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-01-11 23:46:01 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
2012-10-03 04:52:11 -04:00
|
|
|
inline bool IsBlockLiquid(BLOCKTYPE a_BlockType)
|
2012-07-12 13:26:00 -04:00
|
|
|
{
|
2012-10-03 04:52:11 -04:00
|
|
|
return IsBlockWater(a_BlockType) || IsBlockLava(a_BlockType);
|
2012-07-12 13:26:00 -04:00
|
|
|
}
|
|
|
|
|
2013-01-11 23:46:01 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
2014-01-19 09:52:45 -05:00
|
|
|
inline bool IsBlockRail(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
switch (a_BlockType)
|
|
|
|
{
|
|
|
|
case E_BLOCK_RAIL:
|
|
|
|
case E_BLOCK_ACTIVATOR_RAIL:
|
|
|
|
case E_BLOCK_DETECTOR_RAIL:
|
|
|
|
case E_BLOCK_POWERED_RAIL:
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default: return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-01-11 23:46:01 -05:00
|
|
|
|
2012-10-03 04:52:11 -04:00
|
|
|
inline bool IsBlockTypeOfDirt(BLOCKTYPE a_BlockType)
|
2012-07-15 16:36:34 -04:00
|
|
|
{
|
2012-10-03 04:52:11 -04:00
|
|
|
switch (a_BlockType)
|
2012-07-15 16:36:34 -04:00
|
|
|
{
|
|
|
|
case E_BLOCK_DIRT:
|
|
|
|
case E_BLOCK_GRASS:
|
|
|
|
case E_BLOCK_FARMLAND:
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_BLOCK_GRASS_PATH:
|
2013-01-11 23:46:01 -05:00
|
|
|
{
|
2012-07-15 16:36:34 -04:00
|
|
|
return true;
|
2013-01-11 23:46:01 -05:00
|
|
|
}
|
2012-07-15 16:36:34 -04:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2012-07-12 13:26:00 -04:00
|
|
|
|
2012-06-14 09:06:06 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
2015-12-23 18:03:04 -05:00
|
|
|
inline bool IsBlockFence(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
switch (a_BlockType)
|
|
|
|
{
|
2015-12-27 07:54:52 -05:00
|
|
|
case E_BLOCK_ACACIA_FENCE:
|
|
|
|
case E_BLOCK_ACACIA_FENCE_GATE:
|
|
|
|
case E_BLOCK_BIRCH_FENCE:
|
|
|
|
case E_BLOCK_BIRCH_FENCE_GATE:
|
2015-12-23 18:03:04 -05:00
|
|
|
case E_BLOCK_COBBLESTONE_WALL:
|
|
|
|
case E_BLOCK_DARK_OAK_FENCE:
|
2015-12-27 07:54:52 -05:00
|
|
|
case E_BLOCK_DARK_OAK_FENCE_GATE:
|
|
|
|
case E_BLOCK_FENCE:
|
|
|
|
case E_BLOCK_JUNGLE_FENCE:
|
|
|
|
case E_BLOCK_JUNGLE_FENCE_GATE:
|
|
|
|
case E_BLOCK_NETHER_BRICK_FENCE:
|
|
|
|
case E_BLOCK_OAK_FENCE_GATE:
|
|
|
|
case E_BLOCK_SPRUCE_FENCE:
|
2015-12-23 18:03:04 -05:00
|
|
|
case E_BLOCK_SPRUCE_FENCE_GATE:
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-11-06 13:30:19 -05:00
|
|
|
|
|
|
|
inline bool IsBlockMaterialWood(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
switch (a_BlockType)
|
|
|
|
{
|
|
|
|
case E_BLOCK_PLANKS:
|
|
|
|
case E_BLOCK_LOG:
|
|
|
|
case E_BLOCK_NOTE_BLOCK:
|
|
|
|
case E_BLOCK_BOOKCASE:
|
|
|
|
case E_BLOCK_OAK_WOOD_STAIRS:
|
|
|
|
case E_BLOCK_CHEST:
|
|
|
|
case E_BLOCK_CRAFTING_TABLE:
|
|
|
|
case E_BLOCK_SIGN_POST:
|
|
|
|
case E_BLOCK_OAK_DOOR:
|
|
|
|
case E_BLOCK_WALLSIGN:
|
|
|
|
case E_BLOCK_WOODEN_PRESSURE_PLATE:
|
|
|
|
case E_BLOCK_JUKEBOX:
|
|
|
|
case E_BLOCK_FENCE:
|
|
|
|
case E_BLOCK_TRAPDOOR:
|
|
|
|
case E_BLOCK_HUGE_BROWN_MUSHROOM:
|
|
|
|
case E_BLOCK_HUGE_RED_MUSHROOM:
|
|
|
|
case E_BLOCK_OAK_FENCE_GATE:
|
|
|
|
case E_BLOCK_DOUBLE_WOODEN_SLAB:
|
|
|
|
case E_BLOCK_WOODEN_SLAB:
|
|
|
|
case E_BLOCK_SPRUCE_WOOD_STAIRS:
|
|
|
|
case E_BLOCK_BIRCH_WOOD_STAIRS:
|
|
|
|
case E_BLOCK_JUNGLE_WOOD_STAIRS:
|
|
|
|
case E_BLOCK_TRAPPED_CHEST:
|
|
|
|
case E_BLOCK_DAYLIGHT_SENSOR:
|
|
|
|
case E_BLOCK_NEW_LOG:
|
|
|
|
case E_BLOCK_ACACIA_WOOD_STAIRS:
|
|
|
|
case E_BLOCK_DARK_OAK_WOOD_STAIRS:
|
|
|
|
case E_BLOCK_STANDING_BANNER:
|
|
|
|
case E_BLOCK_WALL_BANNER:
|
|
|
|
case E_BLOCK_INVERTED_DAYLIGHT_SENSOR:
|
|
|
|
case E_BLOCK_SPRUCE_FENCE_GATE:
|
|
|
|
case E_BLOCK_BIRCH_FENCE_GATE:
|
|
|
|
case E_BLOCK_JUNGLE_FENCE_GATE:
|
|
|
|
case E_BLOCK_DARK_OAK_FENCE_GATE:
|
|
|
|
case E_BLOCK_ACACIA_FENCE_GATE:
|
|
|
|
case E_BLOCK_SPRUCE_FENCE:
|
|
|
|
case E_BLOCK_BIRCH_FENCE:
|
|
|
|
case E_BLOCK_JUNGLE_FENCE:
|
|
|
|
case E_BLOCK_DARK_OAK_FENCE:
|
|
|
|
case E_BLOCK_ACACIA_FENCE:
|
|
|
|
case E_BLOCK_SPRUCE_DOOR:
|
|
|
|
case E_BLOCK_BIRCH_DOOR:
|
|
|
|
case E_BLOCK_JUNGLE_DOOR:
|
|
|
|
case E_BLOCK_ACACIA_DOOR:
|
|
|
|
case E_BLOCK_DARK_OAK_DOOR:
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline bool IsBlockMaterialPlants(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
switch (a_BlockType)
|
|
|
|
{
|
|
|
|
case E_BLOCK_SAPLING:
|
|
|
|
case E_BLOCK_DANDELION:
|
|
|
|
case E_BLOCK_FLOWER:
|
|
|
|
case E_BLOCK_BROWN_MUSHROOM:
|
|
|
|
case E_BLOCK_RED_MUSHROOM:
|
|
|
|
case E_BLOCK_CROPS:
|
|
|
|
case E_BLOCK_REEDS:
|
|
|
|
case E_BLOCK_PUMPKIN_STEM:
|
|
|
|
case E_BLOCK_MELON_STEM:
|
|
|
|
case E_BLOCK_LILY_PAD:
|
|
|
|
case E_BLOCK_NETHER_WART:
|
|
|
|
case E_BLOCK_COCOA_POD:
|
|
|
|
case E_BLOCK_CARROTS:
|
|
|
|
case E_BLOCK_POTATOES:
|
|
|
|
case E_BLOCK_CHORUS_PLANT:
|
|
|
|
case E_BLOCK_CHORUS_FLOWER:
|
|
|
|
case E_BLOCK_BEETROOTS:
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline bool IsBlockMaterialVine(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
switch (a_BlockType)
|
|
|
|
{
|
|
|
|
case E_BLOCK_TALL_GRASS:
|
|
|
|
case E_BLOCK_DEAD_BUSH:
|
|
|
|
case E_BLOCK_VINES:
|
|
|
|
case E_BLOCK_BIG_FLOWER:
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline bool IsBlockMaterialIron(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
switch (a_BlockType)
|
|
|
|
{
|
|
|
|
case E_BLOCK_LAPIS_BLOCK:
|
|
|
|
case E_BLOCK_GOLD_BLOCK:
|
|
|
|
case E_BLOCK_IRON_BLOCK:
|
|
|
|
case E_BLOCK_DIAMOND_BLOCK:
|
|
|
|
case E_BLOCK_IRON_DOOR:
|
|
|
|
case E_BLOCK_IRON_BARS:
|
|
|
|
case E_BLOCK_BREWING_STAND:
|
|
|
|
case E_BLOCK_CAULDRON:
|
|
|
|
case E_BLOCK_EMERALD_BLOCK:
|
|
|
|
case E_BLOCK_COMMAND_BLOCK:
|
|
|
|
case E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:
|
|
|
|
case E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:
|
|
|
|
case E_BLOCK_BLOCK_OF_REDSTONE:
|
|
|
|
case E_BLOCK_HOPPER:
|
|
|
|
case E_BLOCK_IRON_TRAPDOOR:
|
|
|
|
case E_BLOCK_REPEATING_COMMAND_BLOCK:
|
|
|
|
case E_BLOCK_CHAIN_COMMAND_BLOCK:
|
|
|
|
case E_BLOCK_STRUCTURE_BLOCK:
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline bool IsBlockMaterialAnvil(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
return (a_BlockType == E_BLOCK_ANVIL);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline bool IsBlocksWeb(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
return (a_BlockType == E_BLOCK_COBWEB);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline bool IsBlockMaterialLeaves(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
return (a_BlockType == E_BLOCK_LEAVES) || (a_BlockType == E_BLOCK_NEW_LEAVES);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline bool IsBlocksWool(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
return (a_BlockType == E_BLOCK_WOOL);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline bool IsBlockMaterialGourd(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
switch (a_BlockType)
|
|
|
|
{
|
|
|
|
case E_BLOCK_PUMPKIN:
|
|
|
|
case E_BLOCK_JACK_O_LANTERN:
|
|
|
|
case E_BLOCK_MELON:
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline bool IsBlockMaterialCoral(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
return false; // yes, there is no block in minecraft which belongs to this type.
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline bool IsBlockMaterialRock(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
|
|
|
switch (a_BlockType)
|
|
|
|
{
|
|
|
|
case E_BLOCK_STONE:
|
|
|
|
case E_BLOCK_COBBLESTONE:
|
|
|
|
case E_BLOCK_BEDROCK:
|
|
|
|
case E_BLOCK_GOLD_ORE:
|
|
|
|
case E_BLOCK_IRON_ORE:
|
|
|
|
case E_BLOCK_COAL_ORE:
|
|
|
|
case E_BLOCK_LAPIS_ORE:
|
|
|
|
case E_BLOCK_DISPENSER:
|
|
|
|
case E_BLOCK_SANDSTONE:
|
|
|
|
case E_BLOCK_DOUBLE_STONE_SLAB:
|
|
|
|
case E_BLOCK_STONE_SLAB:
|
|
|
|
case E_BLOCK_BRICK:
|
|
|
|
case E_BLOCK_MOSSY_COBBLESTONE:
|
|
|
|
case E_BLOCK_OBSIDIAN:
|
|
|
|
case E_BLOCK_MOB_SPAWNER:
|
|
|
|
case E_BLOCK_DIAMOND_ORE:
|
|
|
|
case E_BLOCK_FURNACE:
|
|
|
|
case E_BLOCK_LIT_FURNACE:
|
|
|
|
case E_BLOCK_COBBLESTONE_STAIRS:
|
|
|
|
case E_BLOCK_STONE_PRESSURE_PLATE:
|
|
|
|
case E_BLOCK_REDSTONE_ORE:
|
|
|
|
case E_BLOCK_REDSTONE_ORE_GLOWING:
|
|
|
|
case E_BLOCK_NETHERRACK:
|
|
|
|
case E_BLOCK_STONE_BRICKS:
|
|
|
|
case E_BLOCK_BRICK_STAIRS:
|
|
|
|
case E_BLOCK_STONE_BRICK_STAIRS:
|
|
|
|
case E_BLOCK_NETHER_BRICK:
|
|
|
|
case E_BLOCK_NETHER_BRICK_FENCE:
|
|
|
|
case E_BLOCK_NETHER_BRICK_STAIRS:
|
|
|
|
case E_BLOCK_ENCHANTMENT_TABLE:
|
|
|
|
case E_BLOCK_END_PORTAL_FRAME:
|
|
|
|
case E_BLOCK_END_STONE:
|
|
|
|
case E_BLOCK_SANDSTONE_STAIRS:
|
|
|
|
case E_BLOCK_EMERALD_ORE:
|
|
|
|
case E_BLOCK_ENDER_CHEST:
|
|
|
|
case E_BLOCK_COBBLESTONE_WALL:
|
|
|
|
case E_BLOCK_NETHER_QUARTZ_ORE:
|
|
|
|
case E_BLOCK_QUARTZ_BLOCK:
|
|
|
|
case E_BLOCK_QUARTZ_STAIRS:
|
|
|
|
case E_BLOCK_DROPPER:
|
|
|
|
case E_BLOCK_STAINED_CLAY:
|
|
|
|
case E_BLOCK_PRISMARINE_BLOCK:
|
|
|
|
case E_BLOCK_HARDENED_CLAY:
|
|
|
|
case E_BLOCK_BLOCK_OF_COAL:
|
|
|
|
case E_BLOCK_RED_SANDSTONE:
|
|
|
|
case E_BLOCK_RED_SANDSTONE_STAIRS:
|
|
|
|
case E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB:
|
|
|
|
case E_BLOCK_RED_SANDSTONE_SLAB:
|
|
|
|
case E_BLOCK_PURPUR_BLOCK:
|
|
|
|
case E_BLOCK_PURPUR_PILLAR:
|
|
|
|
case E_BLOCK_PURPUR_STAIRS:
|
|
|
|
case E_BLOCK_PURPUR_DOUBLE_SLAB:
|
|
|
|
case E_BLOCK_PURPUR_SLAB:
|
|
|
|
case E_BLOCK_END_BRICKS:
|
|
|
|
case E_BLOCK_MAGMA:
|
|
|
|
case E_BLOCK_RED_NETHER_BRICK:
|
|
|
|
case E_BLOCK_BONE_BLOCK:
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_BLOCK_OBSERVER:
|
2016-11-06 13:30:19 -05:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-02-04 13:59:05 -05:00
|
|
|
inline void AddFaceDirection(int & a_BlockX, int & a_BlockY, int & a_BlockZ, eBlockFace a_BlockFace, bool a_bInverse = false) // tolua_export
|
2013-01-11 23:46:01 -05:00
|
|
|
{ // tolua_export
|
2012-08-10 16:42:59 -04:00
|
|
|
if (!a_bInverse)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-01-11 23:46:01 -05:00
|
|
|
switch (a_BlockFace)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-11-16 15:58:17 -05:00
|
|
|
case BLOCK_FACE_YP: a_BlockY++; break;
|
|
|
|
case BLOCK_FACE_YM: a_BlockY--; break;
|
|
|
|
case BLOCK_FACE_ZM: a_BlockZ--; break;
|
|
|
|
case BLOCK_FACE_ZP: a_BlockZ++; break;
|
|
|
|
case BLOCK_FACE_XP: a_BlockX++; break;
|
|
|
|
case BLOCK_FACE_XM: a_BlockX--; break;
|
2015-05-19 06:50:59 -04:00
|
|
|
case BLOCK_FACE_NONE:
|
2012-08-10 16:42:59 -04:00
|
|
|
{
|
2013-01-11 23:46:01 -05:00
|
|
|
LOGWARNING("%s: Unknown face: %d", __FUNCTION__, a_BlockFace);
|
|
|
|
ASSERT(!"AddFaceDirection(): Unknown face");
|
2012-08-10 16:42:59 -04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-01-11 23:46:01 -05:00
|
|
|
switch (a_BlockFace)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-11-16 15:58:17 -05:00
|
|
|
case BLOCK_FACE_YP: a_BlockY--; break;
|
|
|
|
case BLOCK_FACE_YM: a_BlockY++; break;
|
|
|
|
case BLOCK_FACE_ZM: a_BlockZ++; break;
|
|
|
|
case BLOCK_FACE_ZP: a_BlockZ--; break;
|
|
|
|
case BLOCK_FACE_XP: a_BlockX--; break;
|
|
|
|
case BLOCK_FACE_XM: a_BlockX++; break;
|
2015-05-19 06:50:59 -04:00
|
|
|
case BLOCK_FACE_NONE:
|
2012-08-10 16:42:59 -04:00
|
|
|
{
|
2013-01-11 23:46:01 -05:00
|
|
|
LOGWARNING("%s: Unknown inv face: %d", __FUNCTION__, a_BlockFace);
|
|
|
|
ASSERT(!"AddFaceDirection(): Unknown face");
|
2012-08-10 16:42:59 -04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
2013-01-11 23:46:01 -05:00
|
|
|
} // tolua_export
|
2012-06-14 09:06:06 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-02-04 13:59:05 -05:00
|
|
|
inline void AddFaceDirection(int & a_BlockX, unsigned char & a_BlockY, int & a_BlockZ, eBlockFace a_BlockFace, bool a_bInverse = false)
|
2013-01-11 23:46:01 -05:00
|
|
|
{
|
|
|
|
int Y = a_BlockY;
|
|
|
|
AddFaceDirection(a_BlockX, Y, a_BlockZ, a_BlockFace, a_bInverse);
|
2016-09-18 15:43:30 -04:00
|
|
|
a_BlockY = Clamp<unsigned char>(static_cast<unsigned char>(Y), 0, cChunkDef::Height - 1);
|
2013-01-11 23:46:01 -05:00
|
|
|
}
|
2012-06-14 09:06:06 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
2014-10-20 16:55:07 -04:00
|
|
|
|
2013-05-08 05:45:07 -04:00
|
|
|
|
2013-03-09 09:35:43 -05:00
|
|
|
inline void EulerToVector(double a_Pan, double a_Pitch, double & a_X, double & a_Y, double & a_Z)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2014-07-21 09:19:48 -04:00
|
|
|
// a_X = sinf ( a_Pan / 180 * PI) * cosf ( a_Pitch / 180 * PI);
|
|
|
|
// a_Y = -sinf ( a_Pitch / 180 * PI);
|
|
|
|
// a_Z = -cosf ( a_Pan / 180 * PI) * cosf ( a_Pitch / 180 * PI);
|
2014-10-20 16:55:07 -04:00
|
|
|
a_X = cos(a_Pan / 180 * M_PI) * cos(a_Pitch / 180 * M_PI);
|
|
|
|
a_Y = sin(a_Pan / 180 * M_PI) * cos(a_Pitch / 180 * M_PI);
|
|
|
|
a_Z = sin(a_Pitch / 180 * M_PI);
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-03-09 09:35:43 -05:00
|
|
|
inline void VectorToEuler(double a_X, double a_Y, double a_Z, double & a_Pan, double & a_Pitch)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2014-04-17 01:35:26 -04:00
|
|
|
double r = sqrt((a_X * a_X) + (a_Z * a_Z));
|
|
|
|
if (r < std::numeric_limits<double>::epsilon())
|
2013-03-09 09:35:43 -05:00
|
|
|
{
|
2014-04-17 01:35:26 -04:00
|
|
|
a_Pan = 0;
|
2013-03-09 09:35:43 -05:00
|
|
|
}
|
2012-06-14 09:06:06 -04:00
|
|
|
else
|
2013-03-09 09:35:43 -05:00
|
|
|
{
|
2014-10-20 16:55:07 -04:00
|
|
|
a_Pan = atan2(a_Z, a_X) * 180 / M_PI - 90;
|
2013-03-09 09:35:43 -05:00
|
|
|
}
|
2014-04-17 01:35:26 -04:00
|
|
|
|
2014-10-20 16:55:07 -04:00
|
|
|
a_Pitch = atan2(a_Y, r) * 180 / M_PI;
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-03-09 09:35:43 -05:00
|
|
|
inline float GetSignf(float a_Val)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-03-09 09:35:43 -05:00
|
|
|
return (a_Val < 0.f) ? -1.f : 1.f;
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-07-21 09:19:48 -04:00
|
|
|
inline float GetSpecialSignf( float a_Val)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-03-09 09:35:43 -05:00
|
|
|
return (a_Val <= 0.f) ? -1.f : 1.f;
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-02-15 17:16:44 -05:00
|
|
|
|
2014-08-28 09:58:48 -04:00
|
|
|
template <class T> inline T Diff(T a_Val1, T a_Val2)
|
2014-05-09 17:43:00 -04:00
|
|
|
{
|
|
|
|
return std::abs(a_Val1 - a_Val2);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-02-15 17:16:44 -05:00
|
|
|
// tolua_begin
|
|
|
|
|
|
|
|
enum eMessageType
|
2014-02-03 17:46:56 -05:00
|
|
|
{
|
2016-01-30 19:25:03 -05:00
|
|
|
// https://forum.cuberite.org/thread-1212.html
|
2014-02-03 17:46:56 -05:00
|
|
|
// MessageType...
|
|
|
|
|
2014-03-16 13:44:23 -04:00
|
|
|
mtCustom, // Send raw data without any processing
|
|
|
|
mtFailure, // Something could not be done (i.e. command not executed due to insufficient privilege)
|
|
|
|
mtInformation, // Informational message (i.e. command usage)
|
|
|
|
mtSuccess, // Something executed successfully
|
|
|
|
mtWarning, // Something concerning (i.e. reload) is about to happen
|
|
|
|
mtFatal, // Something catastrophic occured (i.e. plugin crash)
|
|
|
|
mtDeath, // Denotes death of player
|
|
|
|
mtPrivateMessage, // Player to player messaging identifier
|
|
|
|
mtJoin, // A player has joined the server
|
|
|
|
mtLeave, // A player has left the server
|
2016-09-25 06:42:05 -04:00
|
|
|
mtMaxPlusOne, // The first invalid type, used for checking on LuaAPI boundaries
|
2014-10-11 22:39:55 -04:00
|
|
|
|
2014-03-16 13:44:23 -04:00
|
|
|
// Common aliases:
|
|
|
|
mtFail = mtFailure,
|
|
|
|
mtError = mtFailure,
|
|
|
|
mtInfo = mtInformation,
|
|
|
|
mtPM = mtPrivateMessage,
|
2014-02-03 17:46:56 -05:00
|
|
|
};
|
|
|
|
|
2014-02-15 17:16:44 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
2013-12-08 07:08:56 -05:00
|
|
|
|
2014-02-07 13:58:52 -05:00
|
|
|
/** Normalizes an angle in degrees to the [-180, +180) range: */
|
2013-12-08 07:08:56 -05:00
|
|
|
inline double NormalizeAngleDegrees(const double a_Degrees)
|
|
|
|
{
|
|
|
|
double Norm = fmod(a_Degrees + 180, 360);
|
|
|
|
if (Norm < 0)
|
|
|
|
{
|
|
|
|
Norm += 360;
|
|
|
|
}
|
|
|
|
return Norm - 180;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-06-14 09:06:06 -04:00
|
|
|
namespace ItemCategory
|
|
|
|
{
|
2012-08-19 07:51:17 -04:00
|
|
|
inline bool IsPickaxe(short a_ItemID)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
|
|
|
return (a_ItemID == E_ITEM_WOODEN_PICKAXE)
|
|
|
|
|| (a_ItemID == E_ITEM_STONE_PICKAXE)
|
|
|
|
|| (a_ItemID == E_ITEM_IRON_PICKAXE)
|
|
|
|
|| (a_ItemID == E_ITEM_GOLD_PICKAXE)
|
|
|
|
|| (a_ItemID == E_ITEM_DIAMOND_PICKAXE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-19 07:51:17 -04:00
|
|
|
inline bool IsAxe(short a_ItemID)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
|
|
|
return (a_ItemID == E_ITEM_WOODEN_AXE)
|
|
|
|
|| (a_ItemID == E_ITEM_STONE_AXE)
|
|
|
|
|| (a_ItemID == E_ITEM_IRON_AXE)
|
|
|
|
|| (a_ItemID == E_ITEM_GOLD_AXE)
|
|
|
|
|| (a_ItemID == E_ITEM_DIAMOND_AXE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-19 07:51:17 -04:00
|
|
|
inline bool IsSword(short a_ItemID)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
|
|
|
return (a_ItemID == E_ITEM_WOODEN_SWORD)
|
|
|
|
|| (a_ItemID == E_ITEM_STONE_SWORD)
|
|
|
|
|| (a_ItemID == E_ITEM_IRON_SWORD)
|
|
|
|
|| (a_ItemID == E_ITEM_GOLD_SWORD)
|
|
|
|
|| (a_ItemID == E_ITEM_DIAMOND_SWORD);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-19 07:51:17 -04:00
|
|
|
inline bool IsHoe(short a_ItemID)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
|
|
|
return (a_ItemID == E_ITEM_WOODEN_HOE)
|
|
|
|
|| (a_ItemID == E_ITEM_STONE_HOE)
|
|
|
|
|| (a_ItemID == E_ITEM_IRON_HOE)
|
|
|
|
|| (a_ItemID == E_ITEM_GOLD_HOE)
|
|
|
|
|| (a_ItemID == E_ITEM_DIAMOND_HOE);
|
|
|
|
}
|
2014-10-11 22:39:55 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-19 07:51:17 -04:00
|
|
|
inline bool IsShovel(short a_ItemID)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
|
|
|
return (a_ItemID == E_ITEM_WOODEN_SHOVEL)
|
|
|
|
|| (a_ItemID == E_ITEM_STONE_SHOVEL)
|
|
|
|
|| (a_ItemID == E_ITEM_IRON_SHOVEL)
|
|
|
|
|| (a_ItemID == E_ITEM_GOLD_SHOVEL)
|
|
|
|
|| (a_ItemID == E_ITEM_DIAMOND_SHOVEL);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-19 07:51:17 -04:00
|
|
|
inline bool IsTool(short a_ItemID)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2014-07-21 09:19:48 -04:00
|
|
|
return IsPickaxe( a_ItemID)
|
|
|
|
|| IsAxe ( a_ItemID)
|
|
|
|
|| IsSword ( a_ItemID)
|
|
|
|
|| IsHoe ( a_ItemID)
|
|
|
|
|| IsShovel ( a_ItemID);
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
2014-10-11 22:39:55 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-19 07:51:17 -04:00
|
|
|
inline bool IsHelmet(short a_ItemType)
|
2012-08-11 15:43:28 -04:00
|
|
|
{
|
|
|
|
return (
|
|
|
|
(a_ItemType == E_ITEM_LEATHER_CAP) ||
|
|
|
|
(a_ItemType == E_ITEM_GOLD_HELMET) ||
|
|
|
|
(a_ItemType == E_ITEM_CHAIN_HELMET) ||
|
|
|
|
(a_ItemType == E_ITEM_IRON_HELMET) ||
|
|
|
|
(a_ItemType == E_ITEM_DIAMOND_HELMET)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-19 07:51:17 -04:00
|
|
|
inline bool IsChestPlate(short a_ItemType)
|
2012-08-11 15:43:28 -04:00
|
|
|
{
|
|
|
|
return (
|
|
|
|
(a_ItemType == E_ITEM_LEATHER_TUNIC) ||
|
|
|
|
(a_ItemType == E_ITEM_GOLD_CHESTPLATE) ||
|
|
|
|
(a_ItemType == E_ITEM_CHAIN_CHESTPLATE) ||
|
|
|
|
(a_ItemType == E_ITEM_IRON_CHESTPLATE) ||
|
|
|
|
(a_ItemType == E_ITEM_DIAMOND_CHESTPLATE)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-19 07:51:17 -04:00
|
|
|
inline bool IsLeggings(short a_ItemType)
|
2012-08-11 15:43:28 -04:00
|
|
|
{
|
|
|
|
return (
|
|
|
|
(a_ItemType == E_ITEM_LEATHER_PANTS) ||
|
|
|
|
(a_ItemType == E_ITEM_GOLD_LEGGINGS) ||
|
|
|
|
(a_ItemType == E_ITEM_CHAIN_LEGGINGS) ||
|
|
|
|
(a_ItemType == E_ITEM_IRON_LEGGINGS) ||
|
|
|
|
(a_ItemType == E_ITEM_DIAMOND_LEGGINGS)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-19 07:51:17 -04:00
|
|
|
inline bool IsBoots(short a_ItemType)
|
2012-08-11 15:43:28 -04:00
|
|
|
{
|
|
|
|
return (
|
|
|
|
(a_ItemType == E_ITEM_LEATHER_BOOTS) ||
|
|
|
|
(a_ItemType == E_ITEM_GOLD_BOOTS) ||
|
|
|
|
(a_ItemType == E_ITEM_CHAIN_BOOTS) ||
|
|
|
|
(a_ItemType == E_ITEM_IRON_BOOTS) ||
|
|
|
|
(a_ItemType == E_ITEM_DIAMOND_BOOTS)
|
|
|
|
);
|
|
|
|
}
|
2014-10-11 22:39:55 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-29 04:30:47 -04:00
|
|
|
inline bool IsMinecart(short a_ItemType)
|
|
|
|
{
|
|
|
|
return (
|
|
|
|
(a_ItemType == E_ITEM_MINECART) ||
|
|
|
|
(a_ItemType == E_ITEM_CHEST_MINECART) ||
|
|
|
|
(a_ItemType == E_ITEM_FURNACE_MINECART) ||
|
|
|
|
(a_ItemType == E_ITEM_MINECART_WITH_TNT) ||
|
|
|
|
(a_ItemType == E_ITEM_MINECART_WITH_HOPPER)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-05-24 03:20:16 -04:00
|
|
|
inline bool IsArmor(short a_ItemType)
|
|
|
|
{
|
|
|
|
return (
|
|
|
|
IsHelmet(a_ItemType) ||
|
|
|
|
IsChestPlate(a_ItemType) ||
|
|
|
|
IsLeggings(a_ItemType) ||
|
|
|
|
IsBoots(a_ItemType)
|
|
|
|
);
|
|
|
|
}
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
2013-11-30 09:57:56 -05:00
|
|
|
|
2013-01-11 23:46:01 -05:00
|
|
|
// tolua_end
|