Merge branch 'master' into Sounds
This commit is contained in:
commit
e48d172f49
@ -22,6 +22,8 @@ function Initialize(Plugin)
|
||||
Plugin:SetVersion(1);
|
||||
|
||||
cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_USED_ITEM, OnPlayerUsedItem);
|
||||
|
||||
LOG("Initialized " .. Plugin:GetName() .. " v." .. Plugin:GetVersion());
|
||||
return true;
|
||||
end
|
||||
|
||||
@ -36,8 +38,8 @@ function OnPlayerUsedItem(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, Cu
|
||||
return false;
|
||||
end;
|
||||
|
||||
if (Player:HasPermission("diamondmover.move") == false) then
|
||||
return true;
|
||||
if (not Player:HasPermission("diamondmover.move")) then
|
||||
return false;
|
||||
end;
|
||||
|
||||
-- Rclk with a diamond to push in the direction the player is facing
|
||||
@ -56,7 +58,7 @@ function OnPlayerUsedItem(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, Cu
|
||||
if (PlayerPitch > 70) then -- looking down
|
||||
BlockY = BlockY - 1;
|
||||
else
|
||||
local PlayerRot = Player:GetRotation() + 180; -- Convert [-180, 180] into [0, 360] for simpler conditions
|
||||
local PlayerRot = Player:GetYaw() + 180; -- Convert [-180, 180] into [0, 360] for simpler conditions
|
||||
if ((PlayerRot < 45) or (PlayerRot > 315)) then
|
||||
BlockZ = BlockZ - 1;
|
||||
else
|
||||
|
@ -59,7 +59,7 @@ void InternalMergeBlocks(
|
||||
}
|
||||
else
|
||||
{
|
||||
BLOCKTYPE FakeDestMeta = 0;
|
||||
NIBBLETYPE FakeDestMeta = 0;
|
||||
Combinator(a_DstTypes[DstIdx], a_SrcTypes[SrcIdx], FakeDestMeta, (NIBBLETYPE)0);
|
||||
}
|
||||
++DstIdx;
|
||||
|
@ -1278,7 +1278,7 @@ void cChunkMap::SetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYP
|
||||
|
||||
|
||||
|
||||
void cChunkMap::SetBlock(cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, BLOCKTYPE a_BlockMeta, bool a_SendToClients)
|
||||
void cChunkMap::SetBlock(cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, bool a_SendToClients)
|
||||
{
|
||||
cChunkInterface ChunkInterface(this);
|
||||
if (a_BlockType == E_BLOCK_AIR)
|
||||
@ -1303,7 +1303,7 @@ void cChunkMap::SetBlock(cWorldInterface & a_WorldInterface, int a_BlockX, int a
|
||||
|
||||
|
||||
|
||||
void cChunkMap::QueueSetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, BLOCKTYPE a_BlockMeta, Int64 a_Tick, BLOCKTYPE a_PreviousBlockType)
|
||||
void cChunkMap::QueueSetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Int64 a_Tick, BLOCKTYPE a_PreviousBlockType)
|
||||
{
|
||||
int ChunkX, ChunkZ, X = a_BlockX, Y = a_BlockY, Z = a_BlockZ;
|
||||
cChunkDef::AbsoluteToRelative(X, Y, Z, ChunkX, ChunkZ);
|
||||
|
@ -154,9 +154,9 @@ public:
|
||||
NIBBLETYPE GetBlockMeta (int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
NIBBLETYPE GetBlockSkyLight (int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
NIBBLETYPE GetBlockBlockLight(int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
void SetBlockMeta (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockMeta);
|
||||
void SetBlock (cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, BLOCKTYPE a_BlockMeta, bool a_SendToClients = true);
|
||||
void QueueSetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, BLOCKTYPE a_BlockMeta, Int64 a_Tick, BLOCKTYPE a_PreviousBlockType = E_BLOCK_AIR);
|
||||
void SetBlockMeta (int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_BlockMeta);
|
||||
void SetBlock (cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, bool a_SendToClients = true);
|
||||
void QueueSetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Int64 a_Tick, BLOCKTYPE a_PreviousBlockType = E_BLOCK_AIR);
|
||||
bool GetBlockTypeMeta (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta);
|
||||
bool GetBlockInfo (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight);
|
||||
|
||||
|
@ -900,7 +900,7 @@ cMonster * cMonster::NewMonsterFromType(cMonster::eType a_MobType)
|
||||
case mtMooshroom: toReturn = new cMooshroom(); break;
|
||||
case mtOcelot: toReturn = new cOcelot(); break;
|
||||
case mtPig: toReturn = new cPig(); break;
|
||||
case mtSheep: toReturn = new cSheep (Random.NextInt(15)); break; // Colour parameter
|
||||
case mtSheep: toReturn = new cSheep(); break;
|
||||
case mtSilverfish: toReturn = new cSilverfish(); break;
|
||||
case mtSnowGolem: toReturn = new cSnowGolem(); break;
|
||||
case mtSpider: toReturn = new cSpider(); break;
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include "../BlockID.h"
|
||||
#include "../Entities/Player.h"
|
||||
#include "../World.h"
|
||||
#include "FastRandom.h"
|
||||
|
||||
|
||||
|
||||
@ -16,6 +17,16 @@ cSheep::cSheep(int a_Color) :
|
||||
m_WoolColor(a_Color),
|
||||
m_TimeToStopEating(-1)
|
||||
{
|
||||
// Generate random wool color.
|
||||
if (m_WoolColor == -1)
|
||||
{
|
||||
m_WoolColor = GenerateNaturalRandomColor();
|
||||
}
|
||||
|
||||
if ((m_WoolColor < 0) || (m_WoolColor > 15))
|
||||
{
|
||||
m_WoolColor = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -37,7 +48,7 @@ void cSheep::GetDrops(cItems & a_Drops, cEntity * a_Killer)
|
||||
void cSheep::OnRightClicked(cPlayer & a_Player)
|
||||
{
|
||||
const cItem & EquippedItem = a_Player.GetEquippedItem();
|
||||
if ((EquippedItem.m_ItemType == E_ITEM_SHEARS) && (!m_IsSheared))
|
||||
if ((EquippedItem.m_ItemType == E_ITEM_SHEARS) && !IsSheared() && !IsBaby())
|
||||
{
|
||||
m_IsSheared = true;
|
||||
m_World->BroadcastEntityMetadata(*this);
|
||||
@ -51,6 +62,7 @@ void cSheep::OnRightClicked(cPlayer & a_Player)
|
||||
int NumDrops = m_World->GetTickRandomNumber(2) + 1;
|
||||
Drops.push_back(cItem(E_BLOCK_WOOL, NumDrops, m_WoolColor));
|
||||
m_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ(), 10);
|
||||
m_World->BroadcastSoundEffect("mob.sheep.shear", POSX_TOINT * 8, POSY_TOINT * 8, POSZ_TOINT * 8, 1.0f, 1.0f);
|
||||
}
|
||||
else if ((EquippedItem.m_ItemType == E_ITEM_DYE) && (m_WoolColor != 15 - EquippedItem.m_ItemDamage))
|
||||
{
|
||||
@ -109,3 +121,38 @@ void cSheep::Tick(float a_Dt, cChunk & a_Chunk)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
NIBBLETYPE cSheep::GenerateNaturalRandomColor(void)
|
||||
{
|
||||
cFastRandom Random;
|
||||
int Chance = Random.NextInt(101);
|
||||
|
||||
if (Chance <= 81)
|
||||
{
|
||||
return E_META_WOOL_WHITE;
|
||||
}
|
||||
else if (Chance <= 86)
|
||||
{
|
||||
return E_META_WOOL_BLACK;
|
||||
}
|
||||
else if (Chance <= 91)
|
||||
{
|
||||
return E_META_WOOL_GRAY;
|
||||
}
|
||||
else if (Chance <= 96)
|
||||
{
|
||||
return E_META_WOOL_LIGHTGRAY;
|
||||
}
|
||||
else if (Chance <= 99)
|
||||
{
|
||||
return E_META_WOOL_BROWN;
|
||||
}
|
||||
else
|
||||
{
|
||||
return E_META_WOOL_PINK;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,12 @@ class cSheep :
|
||||
typedef cPassiveMonster super;
|
||||
|
||||
public:
|
||||
cSheep(int a_Color);
|
||||
|
||||
/** The number is the color of the sheep.
|
||||
Use E_META_WOOL_* constants for the wool color.
|
||||
If you type -1, the server will generate a random color
|
||||
with the GenerateNaturalRandomColor() function. */
|
||||
cSheep(int a_Color = -1);
|
||||
|
||||
CLASS_PROTODEF(cSheep);
|
||||
|
||||
@ -23,11 +28,17 @@ public:
|
||||
|
||||
virtual const cItem GetFollowedItem(void) const override { return cItem(E_ITEM_WHEAT); }
|
||||
|
||||
/** Generates a random color for the sheep like the vanilla server.
|
||||
The percent's where used are from the wiki: http://minecraft.gamepedia.com/Sheep#Breeding */
|
||||
static NIBBLETYPE GenerateNaturalRandomColor(void);
|
||||
|
||||
bool IsSheared(void) const { return m_IsSheared; }
|
||||
void SetSheared(bool a_IsSheared) { m_IsSheared = a_IsSheared; }
|
||||
|
||||
int GetFurColor(void) const { return m_WoolColor; }
|
||||
void SetFurColor(int a_WoolColor) { m_WoolColor = a_WoolColor; }
|
||||
|
||||
private:
|
||||
|
||||
bool m_IsSheared;
|
||||
int m_WoolColor;
|
||||
int m_TimeToStopEating;
|
||||
|
@ -2086,10 +2086,11 @@ void cWSSAnvil::LoadPigFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NB
|
||||
void cWSSAnvil::LoadSheepFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
|
||||
{
|
||||
int ColorIdx = a_NBT.FindChildByName(a_TagIdx, "Color");
|
||||
|
||||
if (ColorIdx < 0) { return; }
|
||||
|
||||
int Color = (int)a_NBT.GetByte(ColorIdx);
|
||||
int Color = -1;
|
||||
if (ColorIdx > 0)
|
||||
{
|
||||
Color = (int)a_NBT.GetByte(ColorIdx);
|
||||
}
|
||||
|
||||
std::auto_ptr<cSheep> Monster(new cSheep(Color));
|
||||
if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
|
||||
@ -2102,6 +2103,12 @@ void cWSSAnvil::LoadSheepFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
|
||||
return;
|
||||
}
|
||||
|
||||
int ShearedIdx = a_NBT.FindChildByName(a_TagIdx, "Sheared");
|
||||
if (ShearedIdx > 0)
|
||||
{
|
||||
Monster->SetSheared(a_NBT.GetByte(ShearedIdx) != 0);
|
||||
}
|
||||
|
||||
a_Entities.push_back(Monster.release());
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user