Merge branch 'master' into cmake
This commit is contained in:
commit
7735a956f0
6
.gitignore
vendored
6
.gitignore
vendored
@ -11,9 +11,11 @@ cloc.xsl
|
|||||||
*.user
|
*.user
|
||||||
*.suo
|
*.suo
|
||||||
/EveryNight.cmd
|
/EveryNight.cmd
|
||||||
*.sublime-*
|
|
||||||
|
|
||||||
# emacs stuff
|
# IDE Stuff
|
||||||
|
## Sublime Text
|
||||||
|
*.sublime-*
|
||||||
|
## emacs
|
||||||
*.*~
|
*.*~
|
||||||
*~
|
*~
|
||||||
|
|
||||||
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -1,9 +1,9 @@
|
|||||||
[submodule "MCServer/Plugins/Core"]
|
[submodule "MCServer/Plugins/Core"]
|
||||||
path = MCServer/Plugins/Core
|
path = MCServer/Plugins/Core
|
||||||
url = git@github.com:mc-server/Core.git
|
url = git://github.com/mc-server/Core.git
|
||||||
[submodule "MCServer/Plugins/ProtectionAreas"]
|
[submodule "MCServer/Plugins/ProtectionAreas"]
|
||||||
path = MCServer/Plugins/ProtectionAreas
|
path = MCServer/Plugins/ProtectionAreas
|
||||||
url = git@github.com:mc-server/ProtectionAreas.git
|
url = git://github.com/mc-server/ProtectionAreas.git
|
||||||
[submodule "MCServer/Plugins/TransAPI"]
|
[submodule "MCServer/Plugins/TransAPI"]
|
||||||
path = MCServer/Plugins/TransAPI
|
path = MCServer/Plugins/TransAPI
|
||||||
url = git@github.com:bearbin/transapi.git
|
url = git://github.com/bearbin/transapi.git
|
||||||
|
12
.travis.yml
Normal file
12
.travis.yml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
language: cpp
|
||||||
|
compiler:
|
||||||
|
- gcc
|
||||||
|
- clang
|
||||||
|
# Build MCServer
|
||||||
|
script: make release=1 -j 2
|
||||||
|
|
||||||
|
# Notification Settings
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
on_success: change
|
||||||
|
on_failure: always
|
@ -5,3 +5,4 @@ To compile MCServer on *nix, you need a GNUmake-compatible make that reads GNUma
|
|||||||
Run "make" to build a debug version (slow, but gives more info on crash)
|
Run "make" to build a debug version (slow, but gives more info on crash)
|
||||||
Run "make release=1" to build a release version (fast, less info on crash)
|
Run "make release=1" to build a release version (fast, less info on crash)
|
||||||
Add addm32=1 to compile in 32-bit mode on 64-bit systems.
|
Add addm32=1 to compile in 32-bit mode on 64-bit systems.
|
||||||
|
Add `-j 4` to use 4 threads and speed up compilation on multi-core devices.
|
||||||
|
@ -29,3 +29,5 @@ Other Stuff
|
|||||||
For other stuff, including plugins and discussion, check the [forums](http://forum.mc-server.org) and [wiki](http://mc-server.org/wiki/).
|
For other stuff, including plugins and discussion, check the [forums](http://forum.mc-server.org) and [wiki](http://mc-server.org/wiki/).
|
||||||
|
|
||||||
Earn bitcoins for commits or donate to reward the MCServer developers: [![tip for next commit](http://tip4commit.com/projects/74.svg)](http://tip4commit.com/projects/74)
|
Earn bitcoins for commits or donate to reward the MCServer developers: [![tip for next commit](http://tip4commit.com/projects/74.svg)](http://tip4commit.com/projects/74)
|
||||||
|
|
||||||
|
Travis CI: [![Build Status](https://travis-ci.org/mc-server/MCServer.png?branch=master)](https://travis-ci.org/mc-server/MCServer)
|
||||||
|
@ -1358,6 +1358,14 @@
|
|||||||
RelativePath="..\src\Entities\FallingBlock.h"
|
RelativePath="..\src\Entities\FallingBlock.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\src\Entities\Floater.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\src\Entities\Floater.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\Entities\Minecart.cpp"
|
RelativePath="..\src\Entities\Minecart.cpp"
|
||||||
>
|
>
|
||||||
@ -2566,6 +2574,10 @@
|
|||||||
RelativePath="..\src\items\ItemDye.h"
|
RelativePath="..\src\items\ItemDye.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\src\Items\ItemFishingRod.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\Items\ItemFlowerPot.h"
|
RelativePath="..\src\Items\ItemFlowerPot.h"
|
||||||
>
|
>
|
||||||
|
@ -20,7 +20,7 @@ public:
|
|||||||
|
|
||||||
virtual bool CanBeAt(int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
virtual bool CanBeAt(int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
||||||
{
|
{
|
||||||
return ((a_RelY > 0) && g_BlockIsSolid[a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ)]);
|
return ((a_RelY > 0) && g_BlockIsTorchPlaceable[a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -264,9 +264,6 @@ void cClientHandle::Authenticate(void)
|
|||||||
// Send experience
|
// Send experience
|
||||||
m_Player->SendExperience();
|
m_Player->SendExperience();
|
||||||
|
|
||||||
// Send gamemode (1.6.1 movementSpeed):
|
|
||||||
SendGameMode(m_Player->GetGameMode());
|
|
||||||
|
|
||||||
m_Player->Initialize(World);
|
m_Player->Initialize(World);
|
||||||
m_State = csAuthenticated;
|
m_State = csAuthenticated;
|
||||||
|
|
||||||
@ -489,6 +486,9 @@ void cClientHandle::HandleCreativeInventory(short a_SlotNum, const cItem & a_Hel
|
|||||||
|
|
||||||
void cClientHandle::HandlePlayerAbilities(bool a_CanFly, bool a_IsFlying, float FlyingSpeed, float WalkingSpeed)
|
void cClientHandle::HandlePlayerAbilities(bool a_CanFly, bool a_IsFlying, float FlyingSpeed, float WalkingSpeed)
|
||||||
{
|
{
|
||||||
|
UNUSED(FlyingSpeed); // Ignore the client values for these
|
||||||
|
UNUSED(WalkingSpeed);
|
||||||
|
|
||||||
m_Player->SetCanFly(a_CanFly);
|
m_Player->SetCanFly(a_CanFly);
|
||||||
m_Player->SetFlying(a_IsFlying);
|
m_Player->SetFlying(a_IsFlying);
|
||||||
}
|
}
|
||||||
@ -1065,7 +1065,29 @@ void cClientHandle::HandleAnimation(char a_Animation)
|
|||||||
// Plugin disagrees, bail out
|
// Plugin disagrees, bail out
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Because the animation ID sent to servers by clients are different to those sent back, we need this
|
||||||
|
switch (a_Animation)
|
||||||
|
{
|
||||||
|
case 0: // No animation - wiki.vg doesn't say that client has something specific for it, so I suppose it will just become -1
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
a_Animation--; // Offset by -1
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
case 6:
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
a_Animation -= 2; // Offset by -2
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: // Anything else is the same
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
m_Player->GetWorld()->BroadcastEntityAnimation(*m_Player, a_Animation, this);
|
m_Player->GetWorld()->BroadcastEntityAnimation(*m_Player, a_Animation, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,6 +75,7 @@ public:
|
|||||||
etTNT,
|
etTNT,
|
||||||
etProjectile,
|
etProjectile,
|
||||||
etExpOrb,
|
etExpOrb,
|
||||||
|
etFloater,
|
||||||
|
|
||||||
// Common variations
|
// Common variations
|
||||||
etMob = etMonster, // DEPRECATED, use etMonster instead!
|
etMob = etMonster, // DEPRECATED, use etMonster instead!
|
||||||
@ -129,6 +130,8 @@ public:
|
|||||||
bool IsBoat (void) const { return (m_EntityType == etBoat); }
|
bool IsBoat (void) const { return (m_EntityType == etBoat); }
|
||||||
bool IsTNT (void) const { return (m_EntityType == etTNT); }
|
bool IsTNT (void) const { return (m_EntityType == etTNT); }
|
||||||
bool IsProjectile (void) const { return (m_EntityType == etProjectile); }
|
bool IsProjectile (void) const { return (m_EntityType == etProjectile); }
|
||||||
|
bool IsExpOrb (void) const { return (m_EntityType == etExpOrb); }
|
||||||
|
bool IsFloater (void) const { return (m_EntityType == etFloater); }
|
||||||
|
|
||||||
/// Returns true if the entity is of the specified class or a subclass (cPawn's IsA("cEntity") returns true)
|
/// Returns true if the entity is of the specified class or a subclass (cPawn's IsA("cEntity") returns true)
|
||||||
virtual bool IsA(const char * a_ClassName) const;
|
virtual bool IsA(const char * a_ClassName) const;
|
||||||
|
58
src/Entities/Floater.cpp
Normal file
58
src/Entities/Floater.cpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#include "Globals.h"
|
||||||
|
|
||||||
|
#include "Floater.h"
|
||||||
|
#include "Player.h"
|
||||||
|
#include "../ClientHandle.h"
|
||||||
|
|
||||||
|
cFloater::cFloater(double a_X, double a_Y, double a_Z, Vector3d a_Speed, int a_PlayerID) :
|
||||||
|
cEntity(etFloater, a_X, a_Y, a_Z, 0.98, 0.98),
|
||||||
|
m_PlayerID(a_PlayerID),
|
||||||
|
m_CanPickupItem(false),
|
||||||
|
m_PickupCountDown(0)
|
||||||
|
{
|
||||||
|
SetSpeed(a_Speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cFloater::SpawnOn(cClientHandle & a_Client)
|
||||||
|
{
|
||||||
|
a_Client.SendSpawnObject(*this, 90, m_PlayerID, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cFloater::Tick(float a_Dt, cChunk & a_Chunk)
|
||||||
|
{
|
||||||
|
HandlePhysics(a_Dt, a_Chunk);
|
||||||
|
if (IsBlockWater(m_World->GetBlock((int) GetPosX(), (int) GetPosY(), (int) GetPosZ())))
|
||||||
|
{
|
||||||
|
if (m_World->GetTickRandomNumber(100) == 0)
|
||||||
|
{
|
||||||
|
SetPosY(GetPosY() - 1);
|
||||||
|
m_CanPickupItem = true;
|
||||||
|
m_PickupCountDown = 20;
|
||||||
|
LOGD("Floater %i can be picked up", GetUniqueID());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetSpeedY(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SetSpeedX(GetSpeedX() * 0.95);
|
||||||
|
SetSpeedZ(GetSpeedZ() * 0.95);
|
||||||
|
if (CanPickup())
|
||||||
|
{
|
||||||
|
m_PickupCountDown--;
|
||||||
|
if (m_PickupCountDown == 0)
|
||||||
|
{
|
||||||
|
m_CanPickupItem = false;
|
||||||
|
LOGD("The fish is gone. Floater %i can not pick an item up.", GetUniqueID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BroadcastMovementUpdate();
|
||||||
|
}
|
29
src/Entities/Floater.h
Normal file
29
src/Entities/Floater.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Entity.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cFloater :
|
||||||
|
public cEntity
|
||||||
|
{
|
||||||
|
typedef cFloater super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
cFloater(double a_X, double a_Y, double a_Z, Vector3d a_Speed, int a_PlayerID);
|
||||||
|
|
||||||
|
virtual void SpawnOn(cClientHandle & a_Client) override;
|
||||||
|
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
|
||||||
|
|
||||||
|
bool CanPickup(void) const { return m_CanPickupItem; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Vector3d m_Speed;
|
||||||
|
int m_PickupCountDown;
|
||||||
|
int m_PlayerID;
|
||||||
|
bool m_CanPickupItem;
|
||||||
|
} ;
|
@ -65,6 +65,8 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName)
|
|||||||
, m_IsSubmerged(false)
|
, m_IsSubmerged(false)
|
||||||
, m_IsFlying(false)
|
, m_IsFlying(false)
|
||||||
, m_CanFly(false)
|
, m_CanFly(false)
|
||||||
|
, m_IsFishing(false)
|
||||||
|
, m_FloaterID(-1)
|
||||||
, m_EatingFinishTick(-1)
|
, m_EatingFinishTick(-1)
|
||||||
, m_IsChargingBow(false)
|
, m_IsChargingBow(false)
|
||||||
, m_BowCharge(0)
|
, m_BowCharge(0)
|
||||||
@ -1500,6 +1502,24 @@ bool cPlayer::LoadFromDisk()
|
|||||||
//SetExperience(root.get("experience", 0).asInt());
|
//SetExperience(root.get("experience", 0).asInt());
|
||||||
|
|
||||||
m_GameMode = (eGameMode) root.get("gamemode", eGameMode_NotSet).asInt();
|
m_GameMode = (eGameMode) root.get("gamemode", eGameMode_NotSet).asInt();
|
||||||
|
|
||||||
|
if (m_GameMode == eGameMode_Creative)
|
||||||
|
{
|
||||||
|
m_CanFly = true;
|
||||||
|
}
|
||||||
|
else if (m_GameMode == eGameMode_NotSet)
|
||||||
|
{
|
||||||
|
cWorld * World = cRoot::Get()->GetWorld(GetLoadedWorldName());
|
||||||
|
if (World == NULL)
|
||||||
|
{
|
||||||
|
World = cRoot::Get()->GetDefaultWorld();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (World->GetGameMode() == eGameMode_Creative)
|
||||||
|
{
|
||||||
|
m_CanFly = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_Inventory.LoadFromJson(root["inventory"]);
|
m_Inventory.LoadFromJson(root["inventory"]);
|
||||||
|
|
||||||
|
@ -253,6 +253,14 @@ public:
|
|||||||
|
|
||||||
/// Returns true if the player is currently flying.
|
/// Returns true if the player is currently flying.
|
||||||
bool IsFlying(void) const { return m_IsFlying; }
|
bool IsFlying(void) const { return m_IsFlying; }
|
||||||
|
|
||||||
|
/// returns true if the player has thrown out a floater.
|
||||||
|
bool IsFishing(void) const { return m_IsFishing; }
|
||||||
|
|
||||||
|
void SetIsFishing(bool a_IsFishing, int a_FloaterID = -1) { m_IsFishing = a_IsFishing; m_FloaterID = a_FloaterID; }
|
||||||
|
|
||||||
|
int GetFloaterID(void) const { return m_FloaterID; }
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/// Starts eating the currently equipped item. Resets the eating timer and sends the proper animation packet
|
/// Starts eating the currently equipped item. Resets the eating timer and sends the proper animation packet
|
||||||
@ -429,6 +437,7 @@ protected:
|
|||||||
bool m_IsFlying;
|
bool m_IsFlying;
|
||||||
bool m_IsSwimming;
|
bool m_IsSwimming;
|
||||||
bool m_IsSubmerged;
|
bool m_IsSubmerged;
|
||||||
|
bool m_IsFishing;
|
||||||
|
|
||||||
bool m_CanFly; // If this is true the player can fly. Even if he is not in creative.
|
bool m_CanFly; // If this is true the player can fly. Even if he is not in creative.
|
||||||
|
|
||||||
@ -445,6 +454,7 @@ protected:
|
|||||||
bool m_IsChargingBow;
|
bool m_IsChargingBow;
|
||||||
int m_BowCharge;
|
int m_BowCharge;
|
||||||
|
|
||||||
|
int m_FloaterID;
|
||||||
|
|
||||||
virtual void Destroyed(void);
|
virtual void Destroyed(void);
|
||||||
|
|
||||||
|
78
src/Items/ItemFishingRod.h
Normal file
78
src/Items/ItemFishingRod.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
|
||||||
|
// ItemFishingRod.h
|
||||||
|
|
||||||
|
// Declares the various fishing rod ItemHandlers
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../Entities/Floater.h"
|
||||||
|
#include "../Entities/Entity.h"
|
||||||
|
#include "../Item.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cItemFishingRodHandler :
|
||||||
|
public cItemHandler
|
||||||
|
{
|
||||||
|
typedef cItemHandler super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
cItemFishingRodHandler(int a_ItemType) :
|
||||||
|
super(a_ItemType)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
{
|
||||||
|
if (a_Player->IsFishing())
|
||||||
|
{
|
||||||
|
class cFloaterCallback :
|
||||||
|
public cEntityCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cFloaterCallback(void) :
|
||||||
|
m_CanPickup(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CanPickup(void) const { return m_CanPickup; }
|
||||||
|
Vector3d GetPos(void) const { return m_Pos; }
|
||||||
|
|
||||||
|
virtual bool Item(cEntity * a_Entity) override
|
||||||
|
{
|
||||||
|
m_CanPickup = ((cFloater *)a_Entity)->CanPickup();
|
||||||
|
m_Pos = Vector3d(a_Entity->GetPosX(), a_Entity->GetPosY(), a_Entity->GetPosZ());
|
||||||
|
a_Entity->Destroy(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
bool m_CanPickup;
|
||||||
|
Vector3d m_Pos;
|
||||||
|
} Callbacks;
|
||||||
|
a_World->DoWithEntityByID(a_Player->GetFloaterID(), Callbacks);
|
||||||
|
a_Player->SetIsFishing(false);
|
||||||
|
|
||||||
|
if (Callbacks.CanPickup())
|
||||||
|
{
|
||||||
|
cItems Drops;
|
||||||
|
Drops.Add(cItem(E_ITEM_RAW_FISH));
|
||||||
|
Vector3d FloaterPos(Callbacks.GetPos());
|
||||||
|
Vector3d FlyDirection(a_Player->GetPosition() - FloaterPos);
|
||||||
|
a_World->SpawnItemPickups(Drops, FloaterPos.x, FloaterPos.y, FloaterPos.z, FlyDirection.x, FlyDirection.y, FlyDirection.z);
|
||||||
|
// TODO: More types of pickups.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cFloater * Floater = new cFloater(a_Player->GetPosX(), a_Player->GetStance(), a_Player->GetPosZ(), a_Player->GetLookVector() * 7, a_Player->GetUniqueID());
|
||||||
|
Floater->Initialize(a_World);
|
||||||
|
a_Player->SetIsFishing(true, Floater->GetUniqueID());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} ;
|
@ -17,6 +17,7 @@
|
|||||||
#include "ItemComparator.h"
|
#include "ItemComparator.h"
|
||||||
#include "ItemDoor.h"
|
#include "ItemDoor.h"
|
||||||
#include "ItemDye.h"
|
#include "ItemDye.h"
|
||||||
|
#include "ItemFishingRod.h"
|
||||||
#include "ItemFlowerPot.h"
|
#include "ItemFlowerPot.h"
|
||||||
#include "ItemFood.h"
|
#include "ItemFood.h"
|
||||||
#include "ItemHoe.h"
|
#include "ItemHoe.h"
|
||||||
@ -100,6 +101,7 @@ cItemHandler *cItemHandler::CreateItemHandler(int a_ItemType)
|
|||||||
case E_ITEM_EGG: return new cItemEggHandler();
|
case E_ITEM_EGG: return new cItemEggHandler();
|
||||||
case E_ITEM_ENDER_PEARL: return new cItemEnderPearlHandler();
|
case E_ITEM_ENDER_PEARL: return new cItemEnderPearlHandler();
|
||||||
case E_ITEM_FIREWORK_ROCKET: return new cItemFireworkHandler();
|
case E_ITEM_FIREWORK_ROCKET: return new cItemFireworkHandler();
|
||||||
|
case E_ITEM_FISHING_ROD: return new cItemFishingRodHandler(a_ItemType);
|
||||||
case E_ITEM_FLINT_AND_STEEL: return new cItemLighterHandler(a_ItemType);
|
case E_ITEM_FLINT_AND_STEEL: return new cItemLighterHandler(a_ItemType);
|
||||||
case E_ITEM_FLOWER_POT: return new cItemFlowerPotHandler(a_ItemType);
|
case E_ITEM_FLOWER_POT: return new cItemFlowerPotHandler(a_ItemType);
|
||||||
case E_ITEM_NETHER_WART: return new cItemNetherWartHandler(a_ItemType);
|
case E_ITEM_NETHER_WART: return new cItemNetherWartHandler(a_ItemType);
|
||||||
|
@ -27,6 +27,11 @@ public:
|
|||||||
BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
|
BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
|
||||||
) override
|
) override
|
||||||
{
|
{
|
||||||
|
if (!g_BlockIsTorchPlaceable[a_World->GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ)]) // Some solid blocks, such as cocoa beans, are not suitable for dust
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
a_BlockType = E_BLOCK_REDSTONE_WIRE;
|
a_BlockType = E_BLOCK_REDSTONE_WIRE;
|
||||||
a_BlockMeta = 0;
|
a_BlockMeta = 0;
|
||||||
return true;
|
return true;
|
||||||
|
@ -490,6 +490,7 @@ void cProtocol172::SendPlayerAbilities(void)
|
|||||||
if (m_Client->GetPlayer()->IsGameModeCreative())
|
if (m_Client->GetPlayer()->IsGameModeCreative())
|
||||||
{
|
{
|
||||||
Flags |= 0x01;
|
Flags |= 0x01;
|
||||||
|
Flags |= 0x08; // Godmode, used for creative
|
||||||
}
|
}
|
||||||
if (m_Client->GetPlayer()->IsFlying())
|
if (m_Client->GetPlayer()->IsFlying())
|
||||||
{
|
{
|
||||||
@ -499,7 +500,6 @@ void cProtocol172::SendPlayerAbilities(void)
|
|||||||
{
|
{
|
||||||
Flags |= 0x04;
|
Flags |= 0x04;
|
||||||
}
|
}
|
||||||
// TODO: Other flags (god mode)
|
|
||||||
Pkt.WriteByte(Flags);
|
Pkt.WriteByte(Flags);
|
||||||
// TODO: Pkt.WriteFloat(m_Client->GetPlayer()->GetMaxFlyingSpeed());
|
// TODO: Pkt.WriteFloat(m_Client->GetPlayer()->GetMaxFlyingSpeed());
|
||||||
Pkt.WriteFloat(0.05f);
|
Pkt.WriteFloat(0.05f);
|
||||||
@ -1291,23 +1291,16 @@ void cProtocol172::HandlePacketPlayerAbilities(cByteBuffer & a_ByteBuffer)
|
|||||||
HANDLE_READ(a_ByteBuffer, ReadBEFloat, float, FlyingSpeed);
|
HANDLE_READ(a_ByteBuffer, ReadBEFloat, float, FlyingSpeed);
|
||||||
HANDLE_READ(a_ByteBuffer, ReadBEFloat, float, WalkingSpeed);
|
HANDLE_READ(a_ByteBuffer, ReadBEFloat, float, WalkingSpeed);
|
||||||
|
|
||||||
bool IsFlying, CanFly;
|
bool IsFlying = false, CanFly = false;
|
||||||
if ((Flags & 2) != 0)
|
if ((Flags & 2) != 0)
|
||||||
{
|
{
|
||||||
IsFlying = true;
|
IsFlying = true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
IsFlying = false;
|
|
||||||
}
|
|
||||||
if ((Flags & 4) != 0)
|
if ((Flags & 4) != 0)
|
||||||
{
|
{
|
||||||
CanFly = true;
|
CanFly = true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
CanFly = false;
|
|
||||||
}
|
|
||||||
m_Client->HandlePlayerAbilities(CanFly, IsFlying, FlyingSpeed, WalkingSpeed);
|
m_Client->HandlePlayerAbilities(CanFly, IsFlying, FlyingSpeed, WalkingSpeed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,10 +186,34 @@ void cRedstoneSimulator::SimulateChunk(float a_Dt, int a_ChunkX, int a_ChunkZ, c
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
++itr;
|
itr++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (RepeatersDelayList::iterator itr = m_RepeatersDelayList.begin(); itr != m_RepeatersDelayList.end();)
|
||||||
|
{
|
||||||
|
int RelX = itr->a_BlockPos.x - a_ChunkX * cChunkDef::Width;
|
||||||
|
int RelZ = itr->a_BlockPos.z - a_ChunkZ * cChunkDef::Width;
|
||||||
|
|
||||||
|
BLOCKTYPE SourceBlockType;
|
||||||
|
if (!a_Chunk->UnboundedRelGetBlockType(RelX, itr->a_BlockPos.y, RelZ, SourceBlockType))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((SourceBlockType != E_BLOCK_REDSTONE_REPEATER_ON) && (SourceBlockType != E_BLOCK_REDSTONE_REPEATER_OFF))
|
||||||
|
{
|
||||||
|
itr = m_RepeatersDelayList.erase(itr);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (itr->a_ElapsedTicks < itr->a_DelayTicks)
|
||||||
|
{
|
||||||
|
itr->a_ElapsedTicks++;
|
||||||
|
}
|
||||||
|
|
||||||
|
itr++;
|
||||||
|
}
|
||||||
|
|
||||||
for (cRedstoneSimulatorChunkData::iterator dataitr = ChunkData.begin(), end = ChunkData.end(); dataitr != end;)
|
for (cRedstoneSimulatorChunkData::iterator dataitr = ChunkData.begin(), end = ChunkData.end(); dataitr != end;)
|
||||||
{
|
{
|
||||||
BLOCKTYPE BlockType = a_Chunk->GetBlock(dataitr->x, dataitr->y, dataitr->z);
|
BLOCKTYPE BlockType = a_Chunk->GetBlock(dataitr->x, dataitr->y, dataitr->z);
|
||||||
@ -564,9 +588,8 @@ void cRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_BlockY, int
|
|||||||
{
|
{
|
||||||
NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
||||||
|
|
||||||
// We do this so that the repeater can continually update block power status (without being affected by it's own block type, which would happen if the block powering code was in an IF statement)
|
bool IsOn = ((a_MyState == E_BLOCK_REDSTONE_REPEATER_ON) ? true : false); // Cache if repeater is on
|
||||||
bool IsOn = ((a_MyState == E_BLOCK_REDSTONE_REPEATER_ON) ? true : false);
|
bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta & 0x3); // Cache if repeater is pwoered
|
||||||
bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta & 0x3);
|
|
||||||
|
|
||||||
if (IsSelfPowered && !IsOn) // Queue a power change if I am receiving power but not on
|
if (IsSelfPowered && !IsOn) // Queue a power change if I am receiving power but not on
|
||||||
{
|
{
|
||||||
@ -618,21 +641,19 @@ void cRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_BlockY, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_RepeatersDelayList.erase(itr);
|
// Removal of the data entry will be handled in SimChunk - we still want to continue trying to power blocks, even if our delay time has reached
|
||||||
|
// Otherwise, the power state of blocks in front won't update after we have powered on
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_World.SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_REPEATER_OFF, a_Meta);
|
m_World.SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_REPEATER_OFF, a_Meta);
|
||||||
m_RepeatersDelayList.erase(itr);
|
m_RepeatersDelayList.erase(itr); // We can remove off repeaters which don't need further updating
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
// Tick incrementing handled in SimChunk
|
||||||
itr->a_ElapsedTicks++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1271,6 +1292,15 @@ void cRedstoneSimulator::QueueRepeaterPowerChange(int a_BlockX, int a_BlockY, in
|
|||||||
{
|
{
|
||||||
if (itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)))
|
if (itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)))
|
||||||
{
|
{
|
||||||
|
if (ShouldPowerOn == itr->ShouldPowerOn) // We are queued already for the same thing, don't replace entry
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Already in here (normal to allow repeater to continue on powering and updating blocks in front) - just update info and quit
|
||||||
|
itr->a_DelayTicks = ((a_Meta & 0xC) >> 0x2) + 1;
|
||||||
|
itr->a_ElapsedTicks = 0;
|
||||||
|
itr->ShouldPowerOn = ShouldPowerOn;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user