Parcourir la source

fixed a bug that coused destroyed blocks to appear again

Kolja Strohm il y a 3 ans
Parent
commit
6930e06281

+ 17 - 7
FactoryCraft/Block.cpp

@@ -29,6 +29,7 @@ Block::Block( const BlockType* zType, ItemType* zTool, Framework::Vec3<int> pos,
     currentTickTimeout = 0;
     dimensionId = 0;
     interactable = 0;
+    deadAndRemoved = 0;
     memset( zNeighbours, 0, sizeof( Block* ) * 6 );
 }
 
@@ -37,14 +38,18 @@ Block::~Block()
 
 void Block::onDestroy()
 {
-    Item* blockItem = zType->getItemFromBlock( this );
-    if( blockItem )
+    if( !deadAndRemoved )
     {
-        ItemEntity* itemEntity = new ItemEntity( location + Framework::Vec3<float>( 0.5f, 0.5f, 0.5f ), dimensionId, Game::INSTANCE->getNextEntityId() );
-        ItemStack* stack = new ItemStack( blockItem, 1, blockItem->getMaxStackSize() );
-        itemEntity->unsaveAddItem( stack, NO_DIRECTION );
-        stack->release();
-        Game::INSTANCE->requestWorldUpdate( new AddEntityUpdate( itemEntity, dimensionId ) );
+        Item* blockItem = zType->getItemFromBlock( this );
+        if( blockItem )
+        {
+            ItemEntity* itemEntity = new ItemEntity( location + Framework::Vec3<float>( 0.5f, 0.5f, 0.5f ), dimensionId, Game::INSTANCE->getNextEntityId() );
+            ItemStack* stack = new ItemStack( blockItem, 1, blockItem->getMaxStackSize() );
+            itemEntity->unsaveAddItem( stack, NO_DIRECTION );
+            stack->release();
+            Game::INSTANCE->requestWorldUpdate( new AddEntityUpdate( itemEntity, dimensionId ) );
+            deadAndRemoved = 1;
+        }
     }
 }
 
@@ -228,6 +233,11 @@ void Block::requestTransmission()
     }
 }
 
+bool Block::isDeadAndRemoved() const
+{
+    return deadAndRemoved;
+}
+
 
 BasicBlockItem::BasicBlockItem( const ItemType* zType, const BlockType* zPlacedBlockType, const char* name )
     : Item( zType, name )

+ 2 - 0
FactoryCraft/Block.h

@@ -44,6 +44,7 @@ protected:
     bool tickSource;
     bool interactable;
     bool transmissionRequested;
+    bool deadAndRemoved;
 
     /// <summary>
     /// executes block specific things
@@ -89,6 +90,7 @@ public:
     void setHP( float hp );
     void onAfterTransmission();
     void requestTransmission();
+    bool isDeadAndRemoved() const;
 
     friend BlockType;
 };

+ 15 - 7
FactoryCraft/BlockChangedUpdate.cpp

@@ -26,17 +26,25 @@ void BlockChangedUpdate::write( Framework::StreamWriter* zWriter )
     zWriter->schreibe( (char*)&pos.z, 4 );
     auto b = Game::INSTANCE->zBlockAt( pos, getAffectedDimension() );
     unsigned short blockType = b.isA() ? (unsigned short)b.getA()->zBlockType()->getId() : (unsigned short)b.getB();
-    zWriter->schreibe( (char*)&blockType, 2 );
-    if( b.isA() )
+    if( b.isA() && b.getA()->isDeadAndRemoved() )
     {
-        bool d = 1;
-        zWriter->schreibe( (char*)&d, 1 );
-        StaticRegistry<BlockType>::INSTANCE.zElement( blockType )->saveBlock( b.getA(), zWriter );
+        blockType = 0;
+        zWriter->schreibe( (char*)&blockType, 2 );
     }
     else
     {
-        bool d = 0;
-        zWriter->schreibe( (char*)&d, 1 );
+        zWriter->schreibe( (char*)&blockType, 2 );
+        if( b.isA() )
+        {
+            bool d = 1;
+            zWriter->schreibe( (char*)&d, 1 );
+            StaticRegistry<BlockType>::INSTANCE.zElement( blockType )->saveBlock( b.getA(), zWriter );
+        }
+        else
+        {
+            bool d = 0;
+            zWriter->schreibe( (char*)&d, 1 );
+        }
     }
 }
 

+ 41 - 10
FactoryCraft/Entity.cpp

@@ -56,25 +56,56 @@ void ActionTarget::placeBlock( Entity* zActor, Item* zItem )
     }
 }
 
-void ActionTarget::save( Framework::StreamWriter* zWriter ) const
+void ActionTarget::save( ActionTarget* zTarget, Framework::StreamWriter* zWriter )
 {
-    if( entityId >= 0 )
+    if( zTarget )
     {
-        char b = 1;
-        zWriter->schreibe( &b, 1 );
-        zWriter->schreibe( (char*)&entityId, 4 );
+        if( zTarget->entityId >= 0 )
+        {
+            char b = 1;
+            zWriter->schreibe( &b, 1 );
+            zWriter->schreibe( (char*)&zTarget->entityId, 4 );
+        }
+        else
+        {
+            char b = 2;
+            zWriter->schreibe( &b, 1 );
+            zWriter->schreibe( (char*)&zTarget->blockPos.x, 4 );
+            zWriter->schreibe( (char*)&zTarget->blockPos.y, 4 );
+            zWriter->schreibe( (char*)&zTarget->blockPos.z, 4 );
+            zWriter->schreibe( (char*)&zTarget->targetBlockSide, 4 );
+        }
     }
     else
     {
-        char b = 2;
+        char b = 0;
         zWriter->schreibe( &b, 1 );
-        zWriter->schreibe( (char*)&blockPos.x, 4 );
-        zWriter->schreibe( (char*)&blockPos.y, 4 );
-        zWriter->schreibe( (char*)&blockPos.z, 4 );
-        zWriter->schreibe( (char*)&targetBlockSide, 4 );
     }
 }
 
+ActionTarget* ActionTarget::load( Framework::StreamReader* zReader )
+{
+    char b;
+    zReader->lese( &b, 1 );
+    if( b == 1 )
+    {
+        int id;
+        zReader->lese( (char*)&id, 4 );
+        return new ActionTarget( id );
+    }
+    else if( b == 2 )
+    {
+        Framework::Vec3<int> pos;
+        Direction side;
+        zReader->lese( (char*)&pos.x, 4 );
+        zReader->lese( (char*)&pos.y, 4 );
+        zReader->lese( (char*)&pos.z, 4 );
+        zReader->lese( (char*)&side, 4 );
+        return new ActionTarget( pos, side );
+    }
+    return 0;
+}
+
 
 Entity::Entity( const EntityType* zType, Framework::Vec3<float> location, int dimensionId, int entityId )
     : Inventory( location, true ),

+ 2 - 1
FactoryCraft/Entity.h

@@ -30,7 +30,8 @@ public:
 
     void applyItemSkillOnTarget( Entity* zActor, ItemSkill* zItemSkill, Item* zUsedItem );
     void placeBlock( Entity* zActor, Item* zItem );
-    void save( Framework::StreamWriter* zWriter ) const;
+    static void save( ActionTarget* zTarget, Framework::StreamWriter* zWriter );
+    static ActionTarget* load( Framework::StreamReader* zReader );
 };
 
 class Entity : public Inventory

+ 4 - 0
FactoryCraft/EntityType.cpp

@@ -30,6 +30,9 @@ void EntityType::loadSuperEntity( Entity* zEntity, Framework::StreamReader* zRea
     zReader->lese( (char*)&zEntity->location.x, 4 );
     zReader->lese( (char*)&zEntity->location.y, 4 );
     zReader->lese( (char*)&zEntity->location.z, 4 );
+    if( zEntity->target )
+        delete zEntity->target;
+    zEntity->target = ActionTarget::load( zReader );
 }
 
 void EntityType::saveSuperEntity( Entity* zEntity, Framework::StreamWriter* zWriter ) const
@@ -53,6 +56,7 @@ void EntityType::saveSuperEntity( Entity* zEntity, Framework::StreamWriter* zWri
     zWriter->schreibe( (char*)&zEntity->location.x, 4 );
     zWriter->schreibe( (char*)&zEntity->location.y, 4 );
     zWriter->schreibe( (char*)&zEntity->location.z, 4 );
+    ActionTarget::save( zEntity->target, zWriter );
 }
 
 void EntityType::createSuperEntity( Entity* zEntity ) const