Merge remote-tracking branch 'upstream/master' into Enchanting
This commit is contained in:
commit
2689a63e9c
@ -16,22 +16,22 @@ local function ListSubcommands(a_Player, a_Subcommands, a_CmdString)
|
||||
end
|
||||
|
||||
-- Enum all the subcommands:
|
||||
local Verbs = {};
|
||||
local Verbs = {}
|
||||
for cmd, info in pairs(a_Subcommands) do
|
||||
if (a_Player:HasPermission(info.Permission or "")) then
|
||||
table.insert(Verbs, " " .. a_CmdString .. " " .. cmd);
|
||||
if ((a_Player == nil) or (a_Player:HasPermission(info.Permission or ""))) then
|
||||
table.insert(Verbs, a_CmdString .. " " .. cmd)
|
||||
end
|
||||
end
|
||||
table.sort(Verbs);
|
||||
table.sort(Verbs)
|
||||
|
||||
-- Send the list:
|
||||
if (a_Player == nil) then
|
||||
for idx, verb in ipairs(Verbs) do
|
||||
LOGINFO(verb);
|
||||
LOGINFO(" " .. verb)
|
||||
end
|
||||
else
|
||||
for idx, verb in ipairs(Verbs) do
|
||||
a_Player:SendMessage(verb);
|
||||
a_Player:SendMessage(cCompositeChat(" ", mtInfo):AddSuggestCommandPart(verb, verb))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -2511,7 +2511,7 @@ cChunk * cChunk::GetNeighborChunk(int a_BlockX, int a_BlockZ)
|
||||
cChunk * cChunk::GetRelNeighborChunk(int a_RelX, int a_RelZ)
|
||||
{
|
||||
// If the relative coords are too far away, use the parent's chunk lookup instead:
|
||||
if ((a_RelX < 128) || (a_RelX > 128) || (a_RelZ < -128) || (a_RelZ > 128))
|
||||
if ((a_RelX < -128) || (a_RelX > 128) || (a_RelZ < -128) || (a_RelZ > 128))
|
||||
{
|
||||
int BlockX = m_PosX * cChunkDef::Width + a_RelX;
|
||||
int BlockZ = m_PosZ * cChunkDef::Width + a_RelZ;
|
||||
|
@ -49,21 +49,17 @@ void cEnchantments::AddFromString(const AString & a_StringSpec)
|
||||
LOG("%s: Malformed enchantment decl: \"%s\", skipping.", __FUNCTION__, itr->c_str());
|
||||
continue;
|
||||
}
|
||||
int id = atoi(Split[0].c_str());
|
||||
if ((id == 0) && (Split[0] != "0"))
|
||||
int id = StringToEnchantmentID(Split[0]);
|
||||
if (id < 0)
|
||||
{
|
||||
id = StringToEnchantmentID(Split[0]);
|
||||
LOG("%s: Failed to parse enchantment \"%s\", skipping.", __FUNCTION__, Split[0].c_str());
|
||||
continue;
|
||||
}
|
||||
int lvl = atoi(Split[1].c_str());
|
||||
if (
|
||||
((id <= 0) && (Split[0] != "0")) ||
|
||||
((lvl == 0) && (Split[1] != "0"))
|
||||
)
|
||||
if ((lvl == 0) && (Split[1] != "0"))
|
||||
{
|
||||
// Numbers failed to parse
|
||||
LOG("%s: Failed to parse enchantment declaration for numbers: \"%s\" and \"%s\", skipping.",
|
||||
__FUNCTION__, Split[0].c_str(), Split[1].c_str()
|
||||
);
|
||||
// Level failed to parse
|
||||
LOG("%s: Failed to parse enchantment level \"%s\", skipping.", __FUNCTION__, Split[1].c_str());
|
||||
continue;
|
||||
}
|
||||
SetLevel(id, lvl);
|
||||
@ -150,7 +146,7 @@ bool cEnchantments::IsEmpty(void) const
|
||||
|
||||
int cEnchantments::StringToEnchantmentID(const AString & a_EnchantmentName)
|
||||
{
|
||||
struct
|
||||
static const struct
|
||||
{
|
||||
int m_Value;
|
||||
const char * m_Name;
|
||||
@ -181,6 +177,15 @@ int cEnchantments::StringToEnchantmentID(const AString & a_EnchantmentName)
|
||||
{ enchLuckOfTheSea, "LuckOfTheSea"},
|
||||
{ enchLure, "Lure"},
|
||||
} ;
|
||||
|
||||
// First try to parse as a number:
|
||||
int id = atoi(a_EnchantmentName.c_str());
|
||||
if ((id != 0) || (a_EnchantmentName == "0"))
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
// It wasn't a number, do a lookup:
|
||||
for (size_t i = 0; i < ARRAYCOUNT(EnchantmentNames); i++)
|
||||
{
|
||||
if (NoCaseCompare(EnchantmentNames[i].m_Name, a_EnchantmentName) == 0)
|
||||
|
@ -80,9 +80,9 @@ cNetherFortGen::cNetherFortGen(int a_Seed, int a_GridSize, int a_MaxDepth) :
|
||||
m_MaxDepth(a_MaxDepth)
|
||||
{
|
||||
// Initialize the prefabs:
|
||||
for (size_t i = 0; i < g_NetherFortPrefabs1Count; i++)
|
||||
for (size_t i = 0; i < g_NetherFortPrefabsCount; i++)
|
||||
{
|
||||
cPrefab * Prefab = new cPrefab(g_NetherFortPrefabs1[i]);
|
||||
cPrefab * Prefab = new cPrefab(g_NetherFortPrefabs[i]);
|
||||
m_AllPieces.push_back(Prefab);
|
||||
if (Prefab->HasConnectorType(0))
|
||||
{
|
||||
@ -95,15 +95,17 @@ cNetherFortGen::cNetherFortGen(int a_Seed, int a_GridSize, int a_MaxDepth) :
|
||||
}
|
||||
|
||||
// Initialize the starting piece prefabs:
|
||||
for (size_t i = 0; i < g_NetherFortStartingPrefabs1Count; i++)
|
||||
for (size_t i = 0; i < g_NetherFortStartingPrefabsCount; i++)
|
||||
{
|
||||
m_StartingPieces.push_back(new cPrefab(g_NetherFortStartingPrefabs1[i]));
|
||||
m_StartingPieces.push_back(new cPrefab(g_NetherFortStartingPrefabs[i]));
|
||||
}
|
||||
|
||||
/*
|
||||
// DEBUG: Try one round of placement:
|
||||
cPlacedPieces Pieces;
|
||||
cBFSPieceGenerator pg(*this, a_Seed);
|
||||
pg.PlacePieces(0, 64, 0, a_MaxDepth, Pieces);
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
||||
|
||||
// NetherFortPrefabs.h
|
||||
|
||||
// Declares the data used for nether fortress prefabs
|
||||
// Declares the prefabs in the group NetherFort
|
||||
|
||||
#include "../Prefab.h"
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
|
||||
|
||||
|
||||
extern const cPrefab::sDef g_NetherFortPrefabs1[];
|
||||
extern const cPrefab::sDef g_NetherFortStartingPrefabs1[];
|
||||
extern const size_t g_NetherFortPrefabs1Count;
|
||||
extern const size_t g_NetherFortStartingPrefabs1Count;
|
||||
extern const cPrefab::sDef g_NetherFortPrefabs[];
|
||||
extern const cPrefab::sDef g_NetherFortStartingPrefabs[];
|
||||
extern const size_t g_NetherFortPrefabsCount;
|
||||
extern const size_t g_NetherFortStartingPrefabsCount;
|
||||
|
@ -526,7 +526,10 @@ void cMonster::KilledBy(cEntity * a_Killer)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (a_Killer != NULL)
|
||||
{
|
||||
m_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), Reward);
|
||||
}
|
||||
m_DestroyTimer = 0;
|
||||
}
|
||||
|
||||
|
@ -18,26 +18,33 @@
|
||||
// Usage: SetThreadName (-1, "MainThread");
|
||||
//
|
||||
|
||||
static void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName)
|
||||
{
|
||||
struct
|
||||
{
|
||||
DWORD dwType; // must be 0x1000
|
||||
LPCSTR szName; // pointer to name (in user addr space)
|
||||
DWORD dwThreadID; // thread ID (-1=caller thread)
|
||||
DWORD dwFlags; // reserved for future use, must be zero
|
||||
} info;
|
||||
// Code adapted from MSDN: http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
|
||||
|
||||
const DWORD MS_VC_EXCEPTION = 0x406D1388;
|
||||
|
||||
#pragma pack(push, 8)
|
||||
typedef struct tagTHREADNAME_INFO
|
||||
{
|
||||
DWORD dwType; // Must be 0x1000.
|
||||
LPCSTR szName; // Pointer to name (in user addr space).
|
||||
DWORD dwThreadID; // Thread ID (-1 = caller thread).
|
||||
DWORD dwFlags; // Reserved for future use, must be zero.
|
||||
} THREADNAME_INFO;
|
||||
#pragma pack(pop)
|
||||
|
||||
static void SetThreadName(DWORD dwThreadID, const char * threadName)
|
||||
{
|
||||
THREADNAME_INFO info;
|
||||
info.dwType = 0x1000;
|
||||
info.szName = szThreadName;
|
||||
info.szName = threadName;
|
||||
info.dwThreadID = dwThreadID;
|
||||
info.dwFlags = 0;
|
||||
|
||||
__try
|
||||
{
|
||||
RaiseException(0x406D1388, 0, sizeof(info) / sizeof(DWORD), (DWORD *)&info);
|
||||
RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info);
|
||||
}
|
||||
__except(EXCEPTION_CONTINUE_EXECUTION)
|
||||
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ protected:
|
||||
|
||||
HANDLE m_Handle;
|
||||
|
||||
static DWORD_PTR __stdcall thrExecute(LPVOID a_Param)
|
||||
static DWORD __stdcall thrExecute(LPVOID a_Param)
|
||||
{
|
||||
// Create a window so that the thread can be identified by 3rd party tools:
|
||||
HWND IdentificationWnd = CreateWindow("STATIC", ((cIsThread *)a_Param)->m_ThreadName.c_str(), 0, 0, 0, 0, WS_OVERLAPPED, NULL, NULL, NULL, NULL);
|
||||
|
@ -10,27 +10,34 @@
|
||||
//
|
||||
// Usage: SetThreadName (-1, "MainThread");
|
||||
//
|
||||
|
||||
// Code adapted from MSDN: http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
|
||||
|
||||
const DWORD MS_VC_EXCEPTION = 0x406D1388;
|
||||
|
||||
#pragma pack(push, 8)
|
||||
typedef struct tagTHREADNAME_INFO
|
||||
{
|
||||
DWORD dwType; // must be 0x1000
|
||||
LPCSTR szName; // pointer to name (in user addr space)
|
||||
DWORD dwThreadID; // thread ID (-1=caller thread)
|
||||
DWORD dwFlags; // reserved for future use, must be zero
|
||||
DWORD dwType; // Must be 0x1000.
|
||||
LPCSTR szName; // Pointer to name (in user addr space).
|
||||
DWORD dwThreadID; // Thread ID (-1 = caller thread).
|
||||
DWORD dwFlags; // Reserved for future use, must be zero.
|
||||
} THREADNAME_INFO;
|
||||
#pragma pack(pop)
|
||||
|
||||
void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName)
|
||||
static void SetThreadName(DWORD dwThreadID, const char * threadName)
|
||||
{
|
||||
THREADNAME_INFO info;
|
||||
info.dwType = 0x1000;
|
||||
info.szName = szThreadName;
|
||||
info.szName = threadName;
|
||||
info.dwThreadID = dwThreadID;
|
||||
info.dwFlags = 0;
|
||||
|
||||
__try
|
||||
{
|
||||
RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info );
|
||||
RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info);
|
||||
}
|
||||
__except(EXCEPTION_CONTINUE_EXECUTION)
|
||||
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
||||
|
||||
#include "IncrementalRedstoneSimulator.h"
|
||||
@ -95,26 +96,6 @@ void cIncrementalRedstoneSimulator::RedstoneAddBlock(int a_BlockX, int a_BlockY,
|
||||
PoweredBlocks->erase(itr);
|
||||
break;
|
||||
}
|
||||
else if (Block == E_BLOCK_DAYLIGHT_SENSOR)
|
||||
{
|
||||
if (!a_Chunk->IsLightValid())
|
||||
{
|
||||
m_World.QueueLightChunk(a_Chunk->GetPosX(), a_Chunk->GetPosZ());
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
NIBBLETYPE SkyLight;
|
||||
a_Chunk->UnboundedRelGetBlockSkyLight(RelX, itr->a_SourcePos.y + 1, RelZ, SkyLight);
|
||||
|
||||
if (a_Chunk->GetTimeAlteredLight(SkyLight) <= 8) // Could use SkyLight - m_World.GetSkyDarkness();
|
||||
{
|
||||
LOGD("cIncrementalRedstoneSimulator: Erased daylight sensor from powered blocks list due to insufficient light level");
|
||||
PoweredBlocks->erase(itr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LinkedBlocksList * LinkedPoweredBlocks = a_Chunk->GetRedstoneSimulatorLinkedBlocksList();
|
||||
@ -557,8 +538,8 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block
|
||||
}
|
||||
else
|
||||
{
|
||||
NIBBLETYPE MetaToSet = 0;
|
||||
NIBBLETYPE MyMeta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
||||
NIBBLETYPE MetaToSet = MyMeta;
|
||||
int TimesMetaSmaller = 0, TimesFoundAWire = 0;
|
||||
|
||||
for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++) // Loop through all directions to transfer or receive power
|
||||
@ -588,9 +569,9 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block
|
||||
|
||||
if (SurroundMeta > 1) // Wires of power 1 or 0 cannot transfer power TO ME, don't bother checking
|
||||
{
|
||||
// Does surrounding wire have a higher power level than self?
|
||||
// Does surrounding wire have a higher power level than the highest so far (MetaToSet)?
|
||||
// >= to fix a bug where wires bordering each other with the same power level will appear (in terms of meta) to power each other, when they aren't actually in the powered list
|
||||
if (SurroundMeta >= MyMeta)
|
||||
if (SurroundMeta >= MetaToSet)
|
||||
{
|
||||
MetaToSet = SurroundMeta - 1; // To improve performance
|
||||
}
|
||||
@ -683,22 +664,43 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block
|
||||
|
||||
void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_MyState)
|
||||
{
|
||||
/* Repeater Orientation Mini Guide:
|
||||
===================================
|
||||
|
||||
|
|
||||
| Z Axis
|
||||
V
|
||||
|
||||
X Axis ---->
|
||||
|
||||
Repeater directions, values from a cWorld::GetBlockMeta(a_BlockX , a_BlockY, a_BlockZ) lookup:
|
||||
|
||||
East (Right) (X+): 0x1
|
||||
West (Left) (X-): 0x3
|
||||
North (Up) (Z-): 0x2
|
||||
South (Down) (Z+): 0x0
|
||||
// TODO: Add E_META_XXX enum entries for all meta values and update project with them
|
||||
|
||||
Sun rises from East (X+)
|
||||
|
||||
*/
|
||||
|
||||
// Create a variable holding my meta to avoid multiple lookups.
|
||||
NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
||||
|
||||
// Do the same for being on, self powered or locked.
|
||||
bool IsOn = (a_MyState == E_BLOCK_REDSTONE_REPEATER_ON);
|
||||
bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta);
|
||||
bool IsLocked = IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta);
|
||||
|
||||
if (IsSelfPowered && !IsOn && !IsLocked) // Queue a power change if powered, but not on and not locked.
|
||||
if (!IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta)) // If we're locked, change nothing. Otherwise:
|
||||
{
|
||||
bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta);
|
||||
if (IsSelfPowered && !IsOn) // Queue a power change if powered, but not on and not locked.
|
||||
{
|
||||
QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, true);
|
||||
}
|
||||
else if (!IsSelfPowered && IsOn && !IsLocked) // Queue a power change if unpowered, on, and not locked.
|
||||
else if (!IsSelfPowered && IsOn) // Queue a power change if unpowered, on, and not locked.
|
||||
{
|
||||
QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, false);
|
||||
}
|
||||
}
|
||||
|
||||
for (RepeatersDelayList::iterator itr = m_RepeatersDelayList->begin(); itr != m_RepeatersDelayList->end(); ++itr)
|
||||
{
|
||||
@ -1226,50 +1228,52 @@ bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_BlockX, int a_BlockY
|
||||
|
||||
bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta)
|
||||
{
|
||||
// Change checking direction according to meta rotation.
|
||||
switch (a_Meta & 0x3) //compare my direction to my neighbor's
|
||||
switch (a_Meta & 0x3) // We only want the 'direction' part of our metadata
|
||||
{
|
||||
|
||||
// If the repeater is facing one direction, do one thing.
|
||||
// If the repeater is looking up or down (If parallel to the Z axis)
|
||||
case 0x0:
|
||||
case 0x2:
|
||||
{
|
||||
if (m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) // Is right neighbor a
|
||||
// Check if eastern(right) neighbor is a powered on repeater who is facing us.
|
||||
if (m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) // Is right neighbor a powered repeater?
|
||||
{
|
||||
NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX + 1, a_BlockY, a_BlockZ) & 0x3;
|
||||
if (otherRepeaterDir == 0x1) { return true; }
|
||||
NIBBLETYPE OtherRepeaterDir = m_World.GetBlockMeta(a_BlockX + 1, a_BlockY, a_BlockZ) & 0x3;
|
||||
if (OtherRepeaterDir == 0x3) { return true; } // If so, I am latched/locked.
|
||||
}
|
||||
|
||||
// Check if western(left) neighbor is a powered on repeater who is facing us.
|
||||
if (m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON)
|
||||
{
|
||||
NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3;
|
||||
if (otherRepeaterDir == 0x3) { return true; }
|
||||
NIBBLETYPE OtherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3;
|
||||
if (OtherRepeaterDir == 0x1) { return true; } // If so, I am latched/locked.
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// If another, do the other.
|
||||
// If the repeater is looking left or right (If parallel to the x axis)
|
||||
case 0x1:
|
||||
case 0x3:
|
||||
{
|
||||
// Check if southern(down) neighbor is a powered on repeater who is facing us.
|
||||
if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ + 1) == E_BLOCK_REDSTONE_REPEATER_ON)
|
||||
{
|
||||
NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ + 1) & 0x3;
|
||||
if (otherRepeaterDir == 0x0) { return true; }
|
||||
NIBBLETYPE OtherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ + 1) & 0x3;
|
||||
if (OtherRepeaterDir == 0x0) { return true; } // If so, am latched/locked.
|
||||
}
|
||||
|
||||
// Check if northern(up) neighbor is a powered on repeater who is facing us.
|
||||
if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ -1) == E_BLOCK_REDSTONE_REPEATER_ON)
|
||||
{
|
||||
NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ - 1) & 0x3;
|
||||
if (otherRepeaterDir == 0x2) { return true; }
|
||||
NIBBLETYPE OtherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ - 1) & 0x3;
|
||||
if (OtherRepeaterDir == 0x2) { return true; } // If so, I am latched/locked.
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return false; // None of the checks succeeded, I am not a locked repeater.
|
||||
}
|
||||
|
||||
|
||||
|
@ -150,7 +150,7 @@ size_t cWorldStorage::GetSaveQueueLength(void)
|
||||
|
||||
void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ, bool a_Generate)
|
||||
{
|
||||
m_LoadQueue.EnqueueItemIfNotPresent(sChunkLoad(a_ChunkX, a_ChunkY, a_ChunkZ, a_Generate));
|
||||
m_LoadQueue.EnqueueItem(sChunkLoad(a_ChunkX, a_ChunkY, a_ChunkZ, a_Generate));
|
||||
m_Event.Set();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user