- implemented the fire simulation in native c++ (cFireSimulator)
- Changed the Durationsystem for Items. cPlayer::UseEquippedItem calls cItem::DamageItem this function damages the item if it has a duration. (needed the duration also in another place so this saves code ;)) - added some other burning blocks - the mobtypes for the settings.ini which i must have forgotten in the last commit git-svn-id: http://mc-server.googlecode.com/svn/trunk@150 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
143b8499e0
commit
c6b4ee8c9f
@ -230,6 +230,7 @@
|
|||||||
<ClCompile Include="..\source\cEnderman.cpp" />
|
<ClCompile Include="..\source\cEnderman.cpp" />
|
||||||
<ClCompile Include="..\source\cEvent.cpp" />
|
<ClCompile Include="..\source\cEvent.cpp" />
|
||||||
<ClCompile Include="..\source\cFileFormatUpdater.cpp" />
|
<ClCompile Include="..\source\cFileFormatUpdater.cpp" />
|
||||||
|
<ClCompile Include="..\source\cFireSimulator.cpp" />
|
||||||
<ClCompile Include="..\source\cFluidSimulator.cpp" />
|
<ClCompile Include="..\source\cFluidSimulator.cpp" />
|
||||||
<ClCompile Include="..\source\cFurnaceEntity.cpp" />
|
<ClCompile Include="..\source\cFurnaceEntity.cpp" />
|
||||||
<ClCompile Include="..\Source\cFurnaceRecipe.cpp" />
|
<ClCompile Include="..\Source\cFurnaceRecipe.cpp" />
|
||||||
@ -377,6 +378,7 @@
|
|||||||
<ClInclude Include="..\source\cEnderman.h" />
|
<ClInclude Include="..\source\cEnderman.h" />
|
||||||
<ClInclude Include="..\source\cEvent.h" />
|
<ClInclude Include="..\source\cEvent.h" />
|
||||||
<ClInclude Include="..\source\cFileFormatUpdater.h" />
|
<ClInclude Include="..\source\cFileFormatUpdater.h" />
|
||||||
|
<ClInclude Include="..\source\cFireSimulator.h" />
|
||||||
<ClInclude Include="..\source\cFluidSimulator.h" />
|
<ClInclude Include="..\source\cFluidSimulator.h" />
|
||||||
<ClInclude Include="..\source\cFurnaceEntity.h" />
|
<ClInclude Include="..\source\cFurnaceEntity.h" />
|
||||||
<ClInclude Include="..\Source\cFurnaceRecipe.h" />
|
<ClInclude Include="..\Source\cFurnaceRecipe.h" />
|
||||||
|
@ -436,7 +436,10 @@
|
|||||||
<Filter Include="Simulator\cSimulator\cFluidSimulator\cLavaSimulator">
|
<Filter Include="Simulator\cSimulator\cFluidSimulator\cLavaSimulator">
|
||||||
<UniqueIdentifier>{b0401fd9-4021-4ab7-bf61-c8de112b4196}</UniqueIdentifier>
|
<UniqueIdentifier>{b0401fd9-4021-4ab7-bf61-c8de112b4196}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Simulator\cSimulator\SandSimulator">
|
<Filter Include="Simulator\cSimulator\cFireSimulator">
|
||||||
|
<UniqueIdentifier>{d788a40d-f6f9-4784-8202-25d38386157a}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Simulator\cSimulator\cSandSimulator">
|
||||||
<UniqueIdentifier>{c5389fa9-20dd-4c52-ac16-2ef0a1115cf1}</UniqueIdentifier>
|
<UniqueIdentifier>{c5389fa9-20dd-4c52-ac16-2ef0a1115cf1}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@ -872,7 +875,10 @@
|
|||||||
<Filter>Simulator\cSimulator</Filter>
|
<Filter>Simulator\cSimulator</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\source\cSandSimulator.cpp">
|
<ClCompile Include="..\source\cSandSimulator.cpp">
|
||||||
<Filter>Simulator\cSimulator\SandSimulator</Filter>
|
<Filter>Simulator\cSimulator\cSandSimulator</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\source\cFireSimulator.cpp">
|
||||||
|
<Filter>Simulator\cSimulator\cFireSimulator</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -1342,7 +1348,10 @@
|
|||||||
<Filter>Simulator\cSimulator</Filter>
|
<Filter>Simulator\cSimulator</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\source\cSandSimulator.h">
|
<ClInclude Include="..\source\cSandSimulator.h">
|
||||||
<Filter>Simulator\cSimulator\SandSimulator</Filter>
|
<Filter>Simulator\cSimulator\cSandSimulator</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\source\cFireSimulator.h">
|
||||||
|
<Filter>Simulator\cSimulator\cFireSimulator</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
6
makefile
6
makefile
@ -239,6 +239,7 @@ MCServer : \
|
|||||||
build/cFluidSimulator.o\
|
build/cFluidSimulator.o\
|
||||||
build/cWaterSimulator.o\
|
build/cWaterSimulator.o\
|
||||||
build/cLavaSimulator.o\
|
build/cLavaSimulator.o\
|
||||||
|
build/cFireSimulator.o\
|
||||||
build/cFileFormatUpdater.o\
|
build/cFileFormatUpdater.o\
|
||||||
build/cItem.o
|
build/cItem.o
|
||||||
$(CC) $(LNK_OPTIONS) \
|
$(CC) $(LNK_OPTIONS) \
|
||||||
@ -442,6 +443,7 @@ MCServer : \
|
|||||||
build/cFluidSimulator.o\
|
build/cFluidSimulator.o\
|
||||||
build/cWaterSimulator.o\
|
build/cWaterSimulator.o\
|
||||||
build/cLavaSimulator.o\
|
build/cLavaSimulator.o\
|
||||||
|
build/cFireSimulator.o\
|
||||||
build/cFileFormatUpdater.o\
|
build/cFileFormatUpdater.o\
|
||||||
build/cItem.o\
|
build/cItem.o\
|
||||||
-o MCServer
|
-o MCServer
|
||||||
@ -648,6 +650,7 @@ clean :
|
|||||||
build/cFluidSimulator.o\
|
build/cFluidSimulator.o\
|
||||||
build/cWaterSimulator.o\
|
build/cWaterSimulator.o\
|
||||||
build/cLavaSimulator.o\
|
build/cLavaSimulator.o\
|
||||||
|
build/cFireSimulator.o\
|
||||||
build/cFileFormatUpdater.o\
|
build/cFileFormatUpdater.o\
|
||||||
build/cItem.o\
|
build/cItem.o\
|
||||||
MCServer
|
MCServer
|
||||||
@ -1480,6 +1483,9 @@ build/cWaterSimulator.o : source/cWaterSimulator.cpp
|
|||||||
|
|
||||||
build/cLavaSimulator.o : source/cLavaSimulator.cpp
|
build/cLavaSimulator.o : source/cLavaSimulator.cpp
|
||||||
$(CC) $(CC_OPTIONS) source/cLavaSimulator.cpp -c $(INCLUDE) -o build/cLavaSimulator.o
|
$(CC) $(CC_OPTIONS) source/cLavaSimulator.cpp -c $(INCLUDE) -o build/cLavaSimulator.o
|
||||||
|
|
||||||
|
build/cFireSimulator.o : source/cFireSimulator.cpp
|
||||||
|
$(CC) $(CC_OPTIONS) source/cFireSimulator.cpp -c $(INCLUDE) -o build/cFireSimulator.o
|
||||||
|
|
||||||
build/cFileFormatUpdater.o : source/cFileFormatUpdater.cpp
|
build/cFileFormatUpdater.o : source/cFileFormatUpdater.cpp
|
||||||
$(CC) $(CC_OPTIONS) source/cFileFormatUpdater.cpp -c $(INCLUDE) -o build/cFileFormatUpdater.o
|
$(CC) $(CC_OPTIONS) source/cFileFormatUpdater.cpp -c $(INCLUDE) -o build/cFileFormatUpdater.o
|
||||||
|
@ -9,7 +9,6 @@ World=world_sexy
|
|||||||
|
|
||||||
[Plugins]
|
[Plugins]
|
||||||
Plugin=Core
|
Plugin=Core
|
||||||
Plugin=Fire
|
|
||||||
Plugin=MagicCarpet
|
Plugin=MagicCarpet
|
||||||
Squirrel=SquirrelChatLog
|
Squirrel=SquirrelChatLog
|
||||||
|
|
||||||
@ -22,9 +21,9 @@ Water=1
|
|||||||
[Monsters]
|
[Monsters]
|
||||||
AnimalsOn=0
|
AnimalsOn=0
|
||||||
AnimalSpawnInterval=10
|
AnimalSpawnInterval=10
|
||||||
Types=Chicken,Spider
|
Types=Spider,Chicken,Cow,Pig,Sheep,Squid,Enderman,Zombiepigman,Cavespider,Creeper,Ghast,Silverfish,Skeleton,Slime,Spider,Zombie
|
||||||
|
|
||||||
[Authentication]
|
[Authentication]
|
||||||
Server=session.minecraft.net
|
Server=session.minecraft.net
|
||||||
Address=/game/checkserver.jsp?user=%USERNAME%&serverId=%SERVERID%
|
Address=/game/checkserver.jsp?user=%USERNAME%&serverId=%SERVERID%
|
||||||
Authenticate=0
|
Authenticate=0
|
@ -20,6 +20,8 @@ ENUM_ITEM_ID cBlockToPickup::ToPickup( unsigned char a_BlockID, ENUM_ITEM_ID a_U
|
|||||||
return E_ITEM_EMPTY;
|
return E_ITEM_EMPTY;
|
||||||
case E_BLOCK_GRASS:
|
case E_BLOCK_GRASS:
|
||||||
return E_ITEM_DIRT;
|
return E_ITEM_DIRT;
|
||||||
|
case E_BLOCK_FIRE:
|
||||||
|
return E_ITEM_EMPTY;
|
||||||
case E_BLOCK_GLASS:
|
case E_BLOCK_GLASS:
|
||||||
return E_ITEM_EMPTY;
|
return E_ITEM_EMPTY;
|
||||||
case E_BLOCK_DIRT:
|
case E_BLOCK_DIRT:
|
||||||
|
@ -587,8 +587,12 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
cWorld* World = m_Player->GetWorld();
|
cWorld* World = m_Player->GetWorld();
|
||||||
|
|
||||||
|
|
||||||
char OldBlock = World->GetBlock(PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ);
|
char OldBlock = World->GetBlock(PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ);
|
||||||
char MetaData = World->GetBlockMeta(PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ);
|
char MetaData = World->GetBlockMeta(PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ);
|
||||||
|
|
||||||
|
|
||||||
bool bBroken = (PacketData->m_Status == 0x02) || g_BlockOneHitDig[(int)OldBlock] || ( (PacketData->m_Status == 0x00) && (m_Player->GetGameMode() == 1) );
|
bool bBroken = (PacketData->m_Status == 0x02) || g_BlockOneHitDig[(int)OldBlock] || ( (PacketData->m_Status == 0x00) && (m_Player->GetGameMode() == 1) );
|
||||||
if(bBroken == false) bBroken = (m_Player->GetInventory().GetEquippedItem().m_ItemID == E_ITEM_SHEARS && OldBlock == E_BLOCK_LEAVES);
|
if(bBroken == false) bBroken = (m_Player->GetInventory().GetEquippedItem().m_ItemID == E_ITEM_SHEARS && OldBlock == E_BLOCK_LEAVES);
|
||||||
|
|
||||||
@ -616,6 +620,20 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
|||||||
}
|
}
|
||||||
if(!cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_BLOCK_DIG, 2, PacketData, m_Player, &PickupItem ) )
|
if(!cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_BLOCK_DIG, 2, PacketData, m_Player, &PickupItem ) )
|
||||||
{
|
{
|
||||||
|
int pX = PacketData->m_PosX, pY = PacketData->m_PosY, pZ = PacketData->m_PosZ;
|
||||||
|
|
||||||
|
AddDirection(pX, (char &) pY, pZ, PacketData->m_Direction);
|
||||||
|
|
||||||
|
char PossibleBlock = World->GetBlock(pX, pY, pZ);
|
||||||
|
|
||||||
|
if(PossibleBlock == E_BLOCK_FIRE)
|
||||||
|
{
|
||||||
|
PacketData->m_PosX = pX;
|
||||||
|
PacketData->m_PosY = pY;
|
||||||
|
PacketData->m_PosZ = pZ;
|
||||||
|
bBroken = true;
|
||||||
|
}
|
||||||
|
|
||||||
if( bBroken ) // Block broken
|
if( bBroken ) // Block broken
|
||||||
{
|
{
|
||||||
if( World->DigBlock( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, PickupItem ) )
|
if( World->DigBlock( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, PickupItem ) )
|
||||||
@ -653,78 +671,8 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
|||||||
World->SetBlock(PacketData->m_PosX, PacketData->m_PosY + 1, PacketData->m_PosZ, E_BLOCK_AIR, 0);
|
World->SetBlock(PacketData->m_PosX, PacketData->m_PosY + 1, PacketData->m_PosZ, E_BLOCK_AIR, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int helditem = m_Player->GetInventory().GetEquippedItem().m_ItemID;
|
m_Player->UseEquippedItem();
|
||||||
bool itemhasdur = false;
|
|
||||||
switch(helditem)
|
|
||||||
{
|
|
||||||
case 256 : itemhasdur = true; break;
|
|
||||||
case 257 : itemhasdur = true; break;
|
|
||||||
case 258 : itemhasdur = true; break;
|
|
||||||
case 267 : itemhasdur = true; break;
|
|
||||||
case 268 : itemhasdur = true; break;
|
|
||||||
case 269 : itemhasdur = true; break;
|
|
||||||
case 270 : itemhasdur = true; break;
|
|
||||||
case 271 : itemhasdur = true; break;
|
|
||||||
case 272 : itemhasdur = true; break;
|
|
||||||
case 273 : itemhasdur = true; break;
|
|
||||||
case 274 : itemhasdur = true; break;
|
|
||||||
case 275 : itemhasdur = true; break;
|
|
||||||
case 276 : itemhasdur = true; break;
|
|
||||||
case 277 : itemhasdur = true; break;
|
|
||||||
case 278 : itemhasdur = true; break;
|
|
||||||
case 279 : itemhasdur = true; break;
|
|
||||||
case 283 : itemhasdur = true; break;
|
|
||||||
case 284 : itemhasdur = true; break;
|
|
||||||
case 285 : itemhasdur = true; break;
|
|
||||||
case 286 : itemhasdur = true; break;
|
|
||||||
case 290 : itemhasdur = true; break;
|
|
||||||
case 291 : itemhasdur = true; break;
|
|
||||||
case 292 : itemhasdur = true; break;
|
|
||||||
case 293 : itemhasdur = true; break;
|
|
||||||
case 294 : itemhasdur = true; break;
|
|
||||||
case 359 : itemhasdur = true; break;
|
|
||||||
}
|
|
||||||
if (itemhasdur)
|
|
||||||
{
|
|
||||||
int maxhelditemdur = 1563;
|
|
||||||
switch(helditem)
|
|
||||||
{
|
|
||||||
case 256 : maxhelditemdur = 251; break;
|
|
||||||
case 257 : maxhelditemdur = 251; break;
|
|
||||||
case 258 : maxhelditemdur = 251; break;
|
|
||||||
case 267 : maxhelditemdur = 251; break;
|
|
||||||
case 268 : maxhelditemdur = 60; break;
|
|
||||||
case 269 : maxhelditemdur = 60; break;
|
|
||||||
case 270 : maxhelditemdur = 60; break;
|
|
||||||
case 271 : maxhelditemdur = 60; break;
|
|
||||||
case 272 : maxhelditemdur = 132; break;
|
|
||||||
case 273 : maxhelditemdur = 132; break;
|
|
||||||
case 274 : maxhelditemdur = 132; break;
|
|
||||||
case 275 : maxhelditemdur = 132; break;
|
|
||||||
case 276 : maxhelditemdur = 1563; break;
|
|
||||||
case 277 : maxhelditemdur = 1563; break;
|
|
||||||
case 278 : maxhelditemdur = 1563; break;
|
|
||||||
case 279 : maxhelditemdur = 1563; break;
|
|
||||||
case 283 : maxhelditemdur = 32; break;
|
|
||||||
case 284 : maxhelditemdur = 32; break;
|
|
||||||
case 285 : maxhelditemdur = 32; break;
|
|
||||||
case 286 : maxhelditemdur = 32; break;
|
|
||||||
case 290 : maxhelditemdur = 60; break;
|
|
||||||
case 291 : maxhelditemdur = 132; break;
|
|
||||||
case 292 : maxhelditemdur = 251; break;
|
|
||||||
case 293 : maxhelditemdur = 1563; break;
|
|
||||||
case 294 : maxhelditemdur = 32; break;
|
|
||||||
case 359 : maxhelditemdur = 251; break;
|
|
||||||
}
|
|
||||||
m_Player->GetInventory().GetEquippedItem().m_ItemHealth ++;
|
|
||||||
LOG("Health: %i", m_Player->GetInventory().GetEquippedItem().m_ItemHealth);
|
|
||||||
if (m_Player->GetInventory().GetEquippedItem().m_ItemHealth >= maxhelditemdur)
|
|
||||||
{
|
|
||||||
LOG("Player %s Broke ID: %i", GetUsername(), m_Player->GetInventory().GetEquippedItem().m_ItemID);
|
|
||||||
m_Player->GetInventory().RemoveItem( m_Player->GetInventory().GetEquippedItem());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -901,6 +849,7 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
|||||||
char MetaData = (char)Equipped.m_ItemHealth;
|
char MetaData = (char)Equipped.m_ItemHealth;
|
||||||
bool LavaBucket = false;
|
bool LavaBucket = false;
|
||||||
bool WaterBucket = false;
|
bool WaterBucket = false;
|
||||||
|
bool bRemoveItem = true;
|
||||||
|
|
||||||
switch( PacketData->m_ItemType ) // Special handling for special items
|
switch( PacketData->m_ItemType ) // Special handling for special items
|
||||||
{
|
{
|
||||||
@ -1022,6 +971,11 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
|||||||
PacketData->m_ItemType = E_BLOCK_WALLSIGN;
|
PacketData->m_ItemType = E_BLOCK_WALLSIGN;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case E_ITEM_FLINT_AND_STEEL:
|
||||||
|
PacketData->m_ItemType = E_ITEM_FIRE;
|
||||||
|
m_Player->UseEquippedItem();
|
||||||
|
bRemoveItem = false;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
@ -1058,23 +1012,28 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
|||||||
break; //happens when you place a block aiming at side of block like torch or stem
|
break; //happens when you place a block aiming at side of block like torch or stem
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (m_Player->GetGameMode() == 1) || (m_Player->GetInventory().RemoveItem( Item )) )
|
if(bRemoveItem)
|
||||||
{
|
{
|
||||||
if (isDoor) {
|
if((m_Player->GetGameMode() != 1) && !m_Player->GetInventory().RemoveItem( Item ))
|
||||||
if ( ( m_Player->GetWorld()->GetBlock( X, Y+1, Z ) == E_BLOCK_AIR ) || ( m_Player->GetWorld()->GetBlock( X, Y+1, Z ) == E_BLOCK_AIR ) ) {
|
break;
|
||||||
m_Player->GetWorld()->SetBlock( X, Y+1, Z, (char)PacketData->m_ItemType, MetaData + 8 );
|
}
|
||||||
|
if (isDoor)
|
||||||
m_Player->GetWorld()->SetBlock( X, Y, Z, (char)PacketData->m_ItemType, MetaData );
|
{
|
||||||
}
|
if ( ( m_Player->GetWorld()->GetBlock( X, Y+1, Z ) == E_BLOCK_AIR ) || ( m_Player->GetWorld()->GetBlock( X, Y+1, Z ) == E_BLOCK_AIR ) )
|
||||||
} else {
|
{
|
||||||
|
m_Player->GetWorld()->SetBlock( X, Y+1, Z, (char)PacketData->m_ItemType, MetaData + 8 );
|
||||||
m_Player->GetWorld()->SetBlock( X, Y, Z, (char)PacketData->m_ItemType, MetaData );
|
m_Player->GetWorld()->SetBlock( X, Y, Z, (char)PacketData->m_ItemType, MetaData );
|
||||||
}
|
}
|
||||||
if (UpdateRedstone) {
|
} else {
|
||||||
cRedstone Redstone(m_Player->GetWorld());
|
m_Player->GetWorld()->SetBlock( X, Y, Z, (char)PacketData->m_ItemType, MetaData );
|
||||||
Redstone.ChangeRedstone( PacketData->m_PosX, PacketData->m_PosY+1, PacketData->m_PosZ, AddedCurrent );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (UpdateRedstone)
|
||||||
|
{
|
||||||
|
cRedstone Redstone(m_Player->GetWorld());
|
||||||
|
Redstone.ChangeRedstone( PacketData->m_PosX, PacketData->m_PosY+1, PacketData->m_PosZ, AddedCurrent );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
124
source/cFireSimulator.cpp
Normal file
124
source/cFireSimulator.cpp
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
#include "cFireSimulator.h"
|
||||||
|
#include "cWorld.h"
|
||||||
|
#include "Vector3i.h"
|
||||||
|
#include "BlockID.h"
|
||||||
|
#include "Defines.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
cFireSimulator::cFireSimulator( cWorld* a_World )
|
||||||
|
: cSimulator(a_World)
|
||||||
|
, m_Blocks(new std::vector <Vector3i *>)
|
||||||
|
, m_Buffer(new std::vector <Vector3i *>)
|
||||||
|
, m_BurningBlocks(new std::vector <Vector3i *>)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
cFireSimulator::~cFireSimulator()
|
||||||
|
{
|
||||||
|
delete m_Buffer;
|
||||||
|
delete m_Blocks;
|
||||||
|
delete m_BurningBlocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cFireSimulator::Simulate( float a_Dt )
|
||||||
|
{
|
||||||
|
m_Buffer->clear();
|
||||||
|
std::swap( m_Blocks, m_Buffer );
|
||||||
|
|
||||||
|
for( std::vector<Vector3i *>::iterator itr = m_Buffer->begin(); itr != m_Buffer->end(); ++itr )
|
||||||
|
{
|
||||||
|
Vector3i *Pos = *itr;
|
||||||
|
|
||||||
|
if(!IsAllowedBlock(m_World->GetBlock(Pos->x, Pos->y, Pos->z))) //Check wheather the block is still burning
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(BurnBlockAround(Pos->x, Pos->y, Pos->z)) //Burn single block and if there was one -> next time again
|
||||||
|
_AddBlock(Pos->x, Pos->y, Pos->z);
|
||||||
|
else
|
||||||
|
if(!IsForeverBurnable(m_World->GetBlock(Pos->x, Pos->y - 1, Pos->z)))
|
||||||
|
m_World->SetBlock(Pos->x, Pos->y, Pos->z, E_BLOCK_AIR, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool cFireSimulator::IsAllowedBlock( char a_BlockID )
|
||||||
|
{
|
||||||
|
return a_BlockID == E_BLOCK_FIRE
|
||||||
|
|| IsBlockLava(a_BlockID);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cFireSimulator::AddBlock(int a_X, int a_Y, int a_Z)
|
||||||
|
{
|
||||||
|
char BlockID = m_World->GetBlock(a_X, a_Y, a_Z);
|
||||||
|
if(!IsAllowedBlock(BlockID)) //This should save very much time because it doesn´t have to iterate through all blocks
|
||||||
|
return;
|
||||||
|
|
||||||
|
//check for duplicates
|
||||||
|
for( std::vector<Vector3i *>::iterator itr = m_Blocks->begin(); itr != m_Blocks->end(); ++itr )
|
||||||
|
{
|
||||||
|
Vector3i *Pos = *itr;
|
||||||
|
if( Pos->x == a_X && Pos->y == a_Y && Pos->z == a_Z )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_AddBlock(a_X, a_Y, a_Z);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void cFireSimulator::_AddBlock(int a_X, int a_Y, int a_Z)
|
||||||
|
{
|
||||||
|
Vector3i *Block = new Vector3i(a_X, a_Y, a_Z);
|
||||||
|
m_Blocks->push_back(Block);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cFireSimulator::IsForeverBurnable( char a_BlockID )
|
||||||
|
{
|
||||||
|
return a_BlockID == E_BLOCK_BLOODSTONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cFireSimulator::IsBurnable( char a_BlockID )
|
||||||
|
{
|
||||||
|
return a_BlockID == E_BLOCK_WOOD
|
||||||
|
|| a_BlockID == E_BLOCK_LEAVES
|
||||||
|
|| a_BlockID == E_BLOCK_LOG
|
||||||
|
|| a_BlockID == E_BLOCK_WHITE_CLOTH
|
||||||
|
|| a_BlockID == E_BLOCK_BOOKCASE
|
||||||
|
|| a_BlockID == E_BLOCK_FENCE
|
||||||
|
|| a_BlockID == E_BLOCK_TNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cFireSimulator::BurnBlockAround(int a_X, int a_Y, int a_Z)
|
||||||
|
{
|
||||||
|
return BurnBlock(a_X + 1, a_Y, a_Z)
|
||||||
|
|| BurnBlock(a_X - 1, a_Y, a_Z)
|
||||||
|
|| BurnBlock(a_X, a_Y + 1, a_Z)
|
||||||
|
|| BurnBlock(a_X, a_Y - 1, a_Z)
|
||||||
|
|| BurnBlock(a_X, a_Y, a_Z + 1)
|
||||||
|
|| BurnBlock(a_X, a_Y, a_Z - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cFireSimulator::BurnBlock(int a_X, int a_Y, int a_Z)
|
||||||
|
{
|
||||||
|
char BlockID = m_World->GetBlock(a_X, a_Y, a_Z);
|
||||||
|
if(IsBurnable(BlockID))
|
||||||
|
{
|
||||||
|
m_World->SetBlock(a_X, a_Y, a_Z, E_BLOCK_FIRE, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(IsForeverBurnable(BlockID))
|
||||||
|
{
|
||||||
|
char BlockAbove = m_World->GetBlock(a_X, a_Y + 1, a_Z);
|
||||||
|
if(BlockAbove == E_BLOCK_AIR)
|
||||||
|
{
|
||||||
|
m_World->SetBlock(a_X, a_Y + 1, a_Z, E_BLOCK_FIRE, 0); //Doesn´t notify the simulator so it won´t go off
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
31
source/cFireSimulator.h
Normal file
31
source/cFireSimulator.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "cSimulator.h"
|
||||||
|
#include "cBlockEntity.h"
|
||||||
|
#include "vector"
|
||||||
|
|
||||||
|
class Vector3i;
|
||||||
|
class cWorld;
|
||||||
|
class cFireSimulator : public cSimulator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cFireSimulator( cWorld* a_World );
|
||||||
|
~cFireSimulator();
|
||||||
|
|
||||||
|
virtual void Simulate( float a_Dt );
|
||||||
|
|
||||||
|
virtual inline bool IsAllowedBlock( char a_BlockID );
|
||||||
|
virtual inline bool IsBurnable( char a_BlockID );
|
||||||
|
|
||||||
|
virtual inline bool IsForeverBurnable( char a_BlockID );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void AddBlock(int a_X, int a_Y, int a_Z);
|
||||||
|
virtual void _AddBlock(int a_X, int a_Y, int a_Z);
|
||||||
|
virtual inline bool BurnBlockAround(int a_X, int a_Y, int a_Z);
|
||||||
|
virtual inline bool BurnBlock(int a_X, int a_Y, int a_Z);
|
||||||
|
|
||||||
|
std::vector <Vector3i *> *m_Blocks;
|
||||||
|
std::vector <Vector3i *> *m_Buffer;
|
||||||
|
|
||||||
|
std::vector <Vector3i *> *m_BurningBlocks;
|
||||||
|
};
|
@ -41,4 +41,4 @@ bool cItem::IsEnchantable(ENUM_ITEM_ID item)
|
|||||||
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,58 @@ public:
|
|||||||
return ( (m_ItemID == a_Item.m_ItemID) && (m_ItemHealth == a_Item.m_ItemHealth) );
|
return ( (m_ItemID == a_Item.m_ItemID) && (m_ItemHealth == a_Item.m_ItemHealth) );
|
||||||
} //tolua_export
|
} //tolua_export
|
||||||
|
|
||||||
|
//TODO Sorry for writing the functions in the header. But somehow it doesn´t worked when I put them into the cpp File :s
|
||||||
|
|
||||||
|
inline int GetMaxDuration()
|
||||||
|
{
|
||||||
|
switch(m_ItemID)
|
||||||
|
{
|
||||||
|
case 256: return 251;
|
||||||
|
case 257: return 251;
|
||||||
|
case 258: return 251;
|
||||||
|
case 259: return 65; //Lighter / Flint and Steel
|
||||||
|
case 267: return 251;
|
||||||
|
case 268: return 60;
|
||||||
|
case 269: return 60;
|
||||||
|
case 270: return 60;
|
||||||
|
case 271: return 60;
|
||||||
|
case 272: return 132;
|
||||||
|
case 273: return 132;
|
||||||
|
case 274: return 132;
|
||||||
|
case 275: return 132;
|
||||||
|
case 276: return 1563;
|
||||||
|
case 277: return 1563;
|
||||||
|
case 278: return 1563;
|
||||||
|
case 279: return 1563;
|
||||||
|
case 283: return 32;
|
||||||
|
case 284: return 32;
|
||||||
|
case 285: return 32;
|
||||||
|
case 286: return 32;
|
||||||
|
case 290: return 60;
|
||||||
|
case 291: return 132;
|
||||||
|
case 292: return 251;
|
||||||
|
case 293: return 1563;
|
||||||
|
case 294: return 32;
|
||||||
|
case 359: return 251;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Damages a weapon. Returns true when destroyed
|
||||||
|
inline bool DamageItem() {
|
||||||
|
if(HasDuration())
|
||||||
|
{
|
||||||
|
m_ItemHealth++;
|
||||||
|
|
||||||
|
if(m_ItemHealth >= GetMaxDuration())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool HasDuration() { return GetMaxDuration() > 0; }
|
||||||
|
|
||||||
void GetJson( Json::Value & a_OutValue ); //tolua_export
|
void GetJson( Json::Value & a_OutValue ); //tolua_export
|
||||||
void FromJson( const Json::Value & a_Value ); //tolua_export
|
void FromJson( const Json::Value & a_Value ); //tolua_export
|
||||||
|
|
||||||
@ -41,4 +93,5 @@ public:
|
|||||||
ENUM_ITEM_ID m_ItemID; //tolua_export
|
ENUM_ITEM_ID m_ItemID; //tolua_export
|
||||||
char m_ItemCount; //tolua_export
|
char m_ItemCount; //tolua_export
|
||||||
short m_ItemHealth; //tolua_export
|
short m_ItemHealth; //tolua_export
|
||||||
|
|
||||||
}; //tolua_export
|
}; //tolua_export
|
@ -830,4 +830,14 @@ const cPlayer::GroupList & cPlayer::GetGroups()
|
|||||||
const char* cPlayer::GetLoadedWorldName()
|
const char* cPlayer::GetLoadedWorldName()
|
||||||
{
|
{
|
||||||
return m_pState->LoadedWorldName.c_str();
|
return m_pState->LoadedWorldName.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void cPlayer::UseEquippedItem()
|
||||||
|
{
|
||||||
|
if(GetGameMode() != 1) //No damage in creative
|
||||||
|
if (GetInventory().GetEquippedItem().DamageItem())
|
||||||
|
{
|
||||||
|
LOG("Player %s Broke ID: %i", GetClientHandle()->GetUsername(), GetInventory().GetEquippedItem().m_ItemID);
|
||||||
|
GetInventory().RemoveItem( GetInventory().GetEquippedItem());
|
||||||
|
}
|
||||||
}
|
}
|
@ -81,6 +81,8 @@ public:
|
|||||||
bool LoadFromDisk();
|
bool LoadFromDisk();
|
||||||
|
|
||||||
const char* GetLoadedWorldName();
|
const char* GetLoadedWorldName();
|
||||||
|
|
||||||
|
void UseEquippedItem();
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "cSimulatorManager.h"
|
#include "cSimulatorManager.h"
|
||||||
#include "cWaterSimulator.h"
|
#include "cWaterSimulator.h"
|
||||||
#include "cLavaSimulator.h"
|
#include "cLavaSimulator.h"
|
||||||
|
#include "cFireSimulator.h"
|
||||||
#include "cSandSimulator.h"
|
#include "cSandSimulator.h"
|
||||||
#include "cChicken.h"
|
#include "cChicken.h"
|
||||||
#include "cSpider.h"
|
#include "cSpider.h"
|
||||||
@ -126,6 +127,7 @@ cWorld::~cWorld()
|
|||||||
delete m_SandSimulator;
|
delete m_SandSimulator;
|
||||||
delete m_WaterSimulator;
|
delete m_WaterSimulator;
|
||||||
delete m_LavaSimulator;
|
delete m_LavaSimulator;
|
||||||
|
delete m_FireSimulator;
|
||||||
|
|
||||||
UnloadUnusedChunks();
|
UnloadUnusedChunks();
|
||||||
delete m_pState->pChunkGenerator;
|
delete m_pState->pChunkGenerator;
|
||||||
@ -240,11 +242,13 @@ cWorld::cWorld( const char* a_WorldName )
|
|||||||
m_WaterSimulator = new cWaterSimulator( this );
|
m_WaterSimulator = new cWaterSimulator( this );
|
||||||
m_LavaSimulator = new cLavaSimulator( this );
|
m_LavaSimulator = new cLavaSimulator( this );
|
||||||
m_SandSimulator = new cSandSimulator(this);
|
m_SandSimulator = new cSandSimulator(this);
|
||||||
|
m_FireSimulator = new cFireSimulator(this);
|
||||||
|
|
||||||
m_SimulatorManager = new cSimulatorManager();
|
m_SimulatorManager = new cSimulatorManager();
|
||||||
m_SimulatorManager->RegisterSimulator(m_WaterSimulator, 6);
|
m_SimulatorManager->RegisterSimulator(m_WaterSimulator, 6);
|
||||||
m_SimulatorManager->RegisterSimulator(m_LavaSimulator, 12);
|
m_SimulatorManager->RegisterSimulator(m_LavaSimulator, 12);
|
||||||
m_SimulatorManager->RegisterSimulator(m_SandSimulator, 1);
|
m_SimulatorManager->RegisterSimulator(m_SandSimulator, 1);
|
||||||
|
m_SimulatorManager->RegisterSimulator(m_FireSimulator, 10);
|
||||||
|
|
||||||
memset( g_BlockLightValue, 0x0, 128 );
|
memset( g_BlockLightValue, 0x0, 128 );
|
||||||
memset( g_BlockSpreadLightFalloff, 0xf, 128 ); // 0xf means total falloff
|
memset( g_BlockSpreadLightFalloff, 0xf, 128 ); // 0xf means total falloff
|
||||||
@ -299,6 +303,7 @@ cWorld::cWorld( const char* a_WorldName )
|
|||||||
g_BlockOneHitDig[ E_BLOCK_REDSTONE_REPEATER_OFF ] = true;
|
g_BlockOneHitDig[ E_BLOCK_REDSTONE_REPEATER_OFF ] = true;
|
||||||
g_BlockOneHitDig[ E_BLOCK_REDSTONE_REPEATER_ON ] = true;
|
g_BlockOneHitDig[ E_BLOCK_REDSTONE_REPEATER_ON ] = true;
|
||||||
g_BlockOneHitDig[ E_BLOCK_LOCKED_CHEST ] = true;
|
g_BlockOneHitDig[ E_BLOCK_LOCKED_CHEST ] = true;
|
||||||
|
g_BlockOneHitDig [ E_BLOCK_FIRE ] = true;
|
||||||
|
|
||||||
// Blocks that breaks when pushed by piston
|
// Blocks that breaks when pushed by piston
|
||||||
g_BlockPistonBreakable[ E_BLOCK_AIR ] = true;
|
g_BlockPistonBreakable[ E_BLOCK_AIR ] = true;
|
||||||
@ -730,13 +735,15 @@ cChunk* cWorld::GetChunkOfBlock( int a_X, int a_Y, int a_Z )
|
|||||||
|
|
||||||
void cWorld::SetBlock( int a_X, int a_Y, int a_Z, char a_BlockType, char a_BlockMeta )
|
void cWorld::SetBlock( int a_X, int a_Y, int a_Z, char a_BlockType, char a_BlockMeta )
|
||||||
{
|
{
|
||||||
this->GetSimulatorManager()->WakeUp(a_X, a_Y, a_Z);
|
int ChunkX, ChunkY, ChunkZ, X = a_X, Y = a_Y, Z = a_Z;
|
||||||
|
AbsoluteToRelative( X, Y, Z, ChunkX, ChunkY, ChunkZ );
|
||||||
int ChunkX, ChunkY, ChunkZ;
|
|
||||||
AbsoluteToRelative( a_X, a_Y, a_Z, ChunkX, ChunkY, ChunkZ );
|
|
||||||
|
|
||||||
cChunk* Chunk = GetChunk( ChunkX, ChunkY, ChunkZ );
|
cChunk* Chunk = GetChunk( ChunkX, ChunkY, ChunkZ );
|
||||||
if( Chunk ) Chunk->SetBlock(a_X, a_Y, a_Z, a_BlockType, a_BlockMeta );
|
if( Chunk )
|
||||||
|
{
|
||||||
|
Chunk->SetBlock(X, Y, Z, a_BlockType, a_BlockMeta );
|
||||||
|
this->GetSimulatorManager()->WakeUp(a_X, a_Y, a_Z);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cWorld::FastSetBlock( int a_X, int a_Y, int a_Z, char a_BlockType, char a_BlockMeta )
|
void cWorld::FastSetBlock( int a_X, int a_Y, int a_Z, char a_BlockType, char a_BlockMeta )
|
||||||
|
@ -16,6 +16,7 @@ enum ENUM_ITEM_ID;
|
|||||||
|
|
||||||
class cPacket;
|
class cPacket;
|
||||||
class cRedstone;
|
class cRedstone;
|
||||||
|
class cFireSimulator;
|
||||||
class cWaterSimulator;
|
class cWaterSimulator;
|
||||||
class cLavaSimulator;
|
class cLavaSimulator;
|
||||||
class cSandSimulator;
|
class cSandSimulator;
|
||||||
@ -184,6 +185,7 @@ private:
|
|||||||
cSandSimulator *m_SandSimulator;
|
cSandSimulator *m_SandSimulator;
|
||||||
cWaterSimulator* m_WaterSimulator;
|
cWaterSimulator* m_WaterSimulator;
|
||||||
cLavaSimulator* m_LavaSimulator;
|
cLavaSimulator* m_LavaSimulator;
|
||||||
|
cFireSimulator* m_FireSimulator;
|
||||||
|
|
||||||
cCriticalSection* m_ClientHandleCriticalSection;
|
cCriticalSection* m_ClientHandleCriticalSection;
|
||||||
cCriticalSection* m_EntitiesCriticalSection;
|
cCriticalSection* m_EntitiesCriticalSection;
|
||||||
|
Loading…
Reference in New Issue
Block a user