forked from oerkki/voxelands
decrease circuit step time, and optimise the active block code a bit
This commit is contained in:
parent
1f85a106b3
commit
fed63b5e1a
|
@ -608,7 +608,7 @@ void content_mapnode_circuit(bool repeat)
|
|||
f->visual_solidness = 1;
|
||||
f->draw_type = CDT_NODEBOX;
|
||||
f->special_alternate_node = CONTENT_CIRCUIT_PISTON_DOWN;
|
||||
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_CIRCUIT_PISTON_UP_OFF)+" 1";
|
||||
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_CIRCUIT_PISTON_OFF)+" 1";
|
||||
f->setAllTextures("circuit_piston_arm.png^[transformR90");
|
||||
f->setTexture(0,"circuit_piston_arm_bottom.png");
|
||||
f->setTexture(1,"circuit_piston_arm_top.png");
|
||||
|
@ -750,7 +750,7 @@ void content_mapnode_circuit(bool repeat)
|
|||
f->visual_solidness = 1;
|
||||
f->draw_type = CDT_NODEBOX;
|
||||
f->special_alternate_node = CONTENT_CIRCUIT_STICKYPISTON_UP;
|
||||
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_CIRCUIT_STICKYPISTON_UP_OFF)+" 1";
|
||||
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_CIRCUIT_STICKYPISTON_OFF)+" 1";
|
||||
f->setAllTextures("circuit_piston_arm.png^[transformR270");
|
||||
f->setTexture(0,"circuit_stickypiston_arm_top.png");
|
||||
f->setTexture(1,"circuit_piston_arm_bottom.png");
|
||||
|
@ -813,7 +813,7 @@ void content_mapnode_circuit(bool repeat)
|
|||
f->visual_solidness = 1;
|
||||
f->draw_type = CDT_NODEBOX;
|
||||
f->special_alternate_node = CONTENT_CIRCUIT_STICKYPISTON_DOWN;
|
||||
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_CIRCUIT_STICKYPISTON_UP_OFF)+" 1";
|
||||
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_CIRCUIT_STICKYPISTON_OFF)+" 1";
|
||||
f->setAllTextures("circuit_piston_arm.png^[transformR90");
|
||||
f->setTexture(0,"circuit_piston_arm_bottom.png");
|
||||
f->setTexture(1,"circuit_stickypiston_arm_top.png");
|
||||
|
|
|
@ -2225,10 +2225,10 @@ void CircuitNodeMetadata::serializeBody(std::ostream &os)
|
|||
os<<itos(i->second) << " ";
|
||||
}
|
||||
}
|
||||
bool CircuitNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
bool CircuitNodeMetadata::stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
{
|
||||
m_ptime += dtime;
|
||||
if (!m_energy || m_ptime < 1.1)
|
||||
if (!m_energy || m_ptime < 0.3)
|
||||
return false;
|
||||
m_energy = 0;
|
||||
MapNode n = env->getMap().getNodeNoEx(pos);
|
||||
|
@ -2308,7 +2308,7 @@ NodeMetadata* SwitchNodeMetadata::clone()
|
|||
SwitchNodeMetadata *d = new SwitchNodeMetadata();
|
||||
return d;
|
||||
}
|
||||
bool SwitchNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
bool SwitchNodeMetadata::stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
{
|
||||
if (!m_energy)
|
||||
return false;
|
||||
|
@ -2391,7 +2391,7 @@ NodeMetadata* ButtonNodeMetadata::clone()
|
|||
ButtonNodeMetadata *d = new ButtonNodeMetadata();
|
||||
return d;
|
||||
}
|
||||
bool ButtonNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
bool ButtonNodeMetadata::stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
{
|
||||
if (!m_energy)
|
||||
return false;
|
||||
|
@ -2457,7 +2457,7 @@ NodeMetadata* SolarPanelNodeMetadata::clone()
|
|||
SolarPanelNodeMetadata *d = new SolarPanelNodeMetadata();
|
||||
return d;
|
||||
}
|
||||
bool SolarPanelNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
bool SolarPanelNodeMetadata::stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
{
|
||||
MapNode n = env->getMap().getNodeNoEx(pos);
|
||||
if (n.getLightBlend(env->getDayNightRatio()) < 10) {
|
||||
|
@ -2522,7 +2522,7 @@ NodeMetadata* WaterWheelNodeMetadata::clone()
|
|||
WaterWheelNodeMetadata *d = new WaterWheelNodeMetadata();
|
||||
return d;
|
||||
}
|
||||
bool WaterWheelNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
bool WaterWheelNodeMetadata::stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
{
|
||||
MapNode n = env->getMap().getNodeNoEx(pos);
|
||||
v3s16 dir = n.getRotation();
|
||||
|
@ -2662,10 +2662,10 @@ NodeMetadata* NotGateNodeMetadata::clone()
|
|||
NotGateNodeMetadata *d = new NotGateNodeMetadata();
|
||||
return d;
|
||||
}
|
||||
bool NotGateNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
bool NotGateNodeMetadata::stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
{
|
||||
m_ptime += dtime;
|
||||
if (m_ptime < 1.1)
|
||||
if (m_ptime < 0.3)
|
||||
return false;
|
||||
|
||||
m_energy = 0;
|
||||
|
@ -2756,7 +2756,7 @@ void RepeaterNodeMetadata::serializeBody(std::ostream &os)
|
|||
os<<itos(i->second) << " ";
|
||||
}
|
||||
}
|
||||
bool RepeaterNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
bool RepeaterNodeMetadata::stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
{
|
||||
m_ptime += dtime;
|
||||
if (m_ptime > 1.0 && m_ticks > 0) {
|
||||
|
@ -2765,7 +2765,7 @@ bool RepeaterNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
|||
}
|
||||
if (!m_energy && !m_ticks) {
|
||||
return false;
|
||||
}else if (m_energy && m_ticks < 3) {
|
||||
}else if (m_energy && m_ticks < 6) {
|
||||
m_ticks++;
|
||||
return true;
|
||||
}
|
||||
|
@ -2857,7 +2857,7 @@ void DoorNodeMetadata::serializeBody(std::ostream &os)
|
|||
os<<itos(i->second) << " ";
|
||||
}
|
||||
}
|
||||
bool DoorNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
bool DoorNodeMetadata::stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
{
|
||||
if (m_ptime == 0.0 && m_otime == 0.0 && m_energy == 0) {
|
||||
MapNode n = env->getMap().getNodeNoEx(pos);
|
||||
|
@ -2886,7 +2886,7 @@ bool DoorNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
|||
env->getMap().addNodeWithEvent(pos,n);
|
||||
}
|
||||
}
|
||||
if (m_ptime < 1.1)
|
||||
if (m_ptime < 0.3)
|
||||
return false;
|
||||
m_energy = 0;
|
||||
m_otime = 5.0;
|
||||
|
@ -2979,7 +2979,7 @@ void PistonNodeMetadata::serializeBody(std::ostream &os)
|
|||
os<<itos(i->second) << " ";
|
||||
}
|
||||
}
|
||||
bool PistonNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
bool PistonNodeMetadata::stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
{
|
||||
m_ptime += dtime;
|
||||
if (!m_energy) {
|
||||
|
@ -3096,7 +3096,7 @@ bool PistonNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (m_ptime < 1.1)
|
||||
if (m_ptime < 0.3)
|
||||
return false;
|
||||
m_energy = 0;
|
||||
return true;
|
||||
|
|
|
@ -486,7 +486,7 @@ public:
|
|||
static NodeMetadata* create(std::istream &is);
|
||||
virtual NodeMetadata* clone();
|
||||
virtual void serializeBody(std::ostream &os);
|
||||
virtual bool step(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
virtual u8 getEnergy()
|
||||
{
|
||||
|
@ -506,7 +506,7 @@ public:
|
|||
virtual u16 typeId() const;
|
||||
static NodeMetadata* create(std::istream &is);
|
||||
virtual NodeMetadata* clone();
|
||||
virtual bool step(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
virtual std::vector<aabb3f> getNodeBoxes(MapNode &n);
|
||||
};
|
||||
|
@ -527,7 +527,7 @@ public:
|
|||
virtual u16 typeId() const;
|
||||
static NodeMetadata* create(std::istream &is);
|
||||
virtual NodeMetadata* clone();
|
||||
virtual bool step(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
};
|
||||
|
||||
|
@ -538,7 +538,7 @@ public:
|
|||
virtual u16 typeId() const;
|
||||
static NodeMetadata* create(std::istream &is);
|
||||
virtual NodeMetadata* clone();
|
||||
virtual bool step(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
};
|
||||
|
||||
|
@ -549,7 +549,7 @@ public:
|
|||
virtual u16 typeId() const;
|
||||
static NodeMetadata* create(std::istream &is);
|
||||
virtual NodeMetadata* clone();
|
||||
virtual bool step(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
};
|
||||
|
||||
|
@ -561,7 +561,7 @@ public:
|
|||
static NodeMetadata* create(std::istream &is);
|
||||
virtual NodeMetadata* clone();
|
||||
virtual void serializeBody(std::ostream &os);
|
||||
virtual bool step(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
private:
|
||||
u8 m_ticks;
|
||||
|
@ -574,7 +574,7 @@ public:
|
|||
virtual u16 typeId() const;
|
||||
static NodeMetadata* create(std::istream &is);
|
||||
virtual NodeMetadata* clone();
|
||||
virtual bool step(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
};
|
||||
|
||||
|
@ -586,7 +586,7 @@ public:
|
|||
static NodeMetadata* create(std::istream &is);
|
||||
virtual NodeMetadata* clone();
|
||||
virtual void serializeBody(std::ostream &os);
|
||||
virtual bool step(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
private:
|
||||
f32 m_otime;
|
||||
|
@ -600,7 +600,7 @@ public:
|
|||
static NodeMetadata* create(std::istream &is);
|
||||
virtual NodeMetadata* clone();
|
||||
virtual void serializeBody(std::ostream &os);
|
||||
virtual bool step(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env);
|
||||
virtual bool energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
private:
|
||||
bool extend(v3s16 pos, v3s16 dir, content_t arm, ServerEnvironment *env);
|
||||
|
|
|
@ -610,8 +610,8 @@ void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime)
|
|||
|
||||
// Run node metadata
|
||||
bool changed = block->m_node_metadata.step((float)dtime_s, block->getPosRelative(),this);
|
||||
if(changed)
|
||||
{
|
||||
bool cchanged = block->m_node_metadata.stepCircuit((float)dtime_s, block->getPosRelative(),this);
|
||||
if (changed || cchanged) {
|
||||
MapEditEvent event;
|
||||
event.type = MEET_BLOCK_NODE_METADATA_CHANGED;
|
||||
event.p = block->getPos();
|
||||
|
@ -619,36 +619,6 @@ void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime)
|
|||
|
||||
block->setChangedFlag();
|
||||
}
|
||||
|
||||
// TODO: Do something
|
||||
// TODO: Implement usage of ActiveBlockModifier
|
||||
|
||||
// Here's a quick demonstration
|
||||
v3s16 p0;
|
||||
for(p0.X=0; p0.X<MAP_BLOCKSIZE; p0.X++)
|
||||
for(p0.Y=0; p0.Y<MAP_BLOCKSIZE; p0.Y++)
|
||||
for(p0.Z=0; p0.Z<MAP_BLOCKSIZE; p0.Z++)
|
||||
{
|
||||
v3s16 p = p0 + block->getPosRelative();
|
||||
MapNode n = block->getNodeNoEx(p0);
|
||||
#if 1
|
||||
// Test something:
|
||||
// Convert all mud under proper day lighting to grass
|
||||
if(n.getContent() == CONTENT_MUD)
|
||||
{
|
||||
if(dtime_s > 300)
|
||||
{
|
||||
MapNode n_top = block->getNodeNoEx(p0+v3s16(0,1,0));
|
||||
if(content_features(n_top).air_equivalent &&
|
||||
n_top.getLight(LIGHTBANK_DAY) >= 13)
|
||||
{
|
||||
n.setContent(CONTENT_GRASS);
|
||||
m_map->addNodeWithEvent(p, n);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void ServerEnvironment::clearAllObjects()
|
||||
|
@ -951,35 +921,44 @@ void ServerEnvironment::step(float dtime)
|
|||
/*
|
||||
Mess around in active blocks
|
||||
*/
|
||||
if(m_active_blocks_nodemetadata_interval.step(dtime, 1.0))
|
||||
{
|
||||
ScopeProfiler sp(g_profiler, "SEnv: mess in act. blocks avg /1s", SPT_AVG);
|
||||
bool circuitstep = m_active_blocks_circuit_interval.step(dtime, 0.2);
|
||||
bool metastep = m_active_blocks_nodemetadata_interval.step(dtime, 1.0);
|
||||
bool nodestep = m_active_blocks_test_interval.step(dtime, 10.0);
|
||||
|
||||
float dtime = 1.0;
|
||||
|
||||
for(core::map<v3s16, bool>::Iterator
|
||||
i = m_active_blocks.m_list.getIterator();
|
||||
i.atEnd()==false; i++)
|
||||
{
|
||||
if (circuitstep || metastep || nodestep) {
|
||||
float circuit_dtime = 0.2;
|
||||
float meta_dtime = 1.0;
|
||||
for (core::map<v3s16, bool>::Iterator i = m_active_blocks.m_list.getIterator(); i.atEnd()==false; i++) {
|
||||
v3s16 p = i.getNode()->getKey();
|
||||
|
||||
/*infostream<<"Server: Block ("<<p.X<<","<<p.Y<<","<<p.Z
|
||||
<<") being handled"<<std::endl;*/
|
||||
|
||||
MapBlock *block = m_map->getBlockNoCreateNoEx(p);
|
||||
if(block==NULL)
|
||||
if (block==NULL)
|
||||
continue;
|
||||
|
||||
// Reset block usage timer
|
||||
block->resetUsageTimer();
|
||||
if (circuitstep || metastep)
|
||||
block->resetUsageTimer();
|
||||
|
||||
// Set current time as timestamp
|
||||
block->setTimestampNoChangedFlag(m_game_time);
|
||||
|
||||
// Run node metadata
|
||||
bool changed = block->m_node_metadata.step(dtime, block->getPosRelative(), this);
|
||||
if(changed)
|
||||
{
|
||||
bool blockchanged = false;
|
||||
|
||||
if (circuitstep) {
|
||||
// Run node metadata
|
||||
bool changed = block->m_node_metadata.stepCircuit(circuit_dtime, block->getPosRelative(), this);
|
||||
if (changed)
|
||||
blockchanged = true;
|
||||
}
|
||||
|
||||
if (metastep) {
|
||||
// Run node metadata
|
||||
bool changed = block->m_node_metadata.step(meta_dtime, block->getPosRelative(), this);
|
||||
if (changed)
|
||||
blockchanged = true;
|
||||
}
|
||||
|
||||
if (blockchanged) {
|
||||
MapEditEvent event;
|
||||
event.type = MEET_BLOCK_NODE_METADATA_CHANGED;
|
||||
event.p = p;
|
||||
|
@ -987,27 +966,10 @@ void ServerEnvironment::step(float dtime)
|
|||
|
||||
block->setChangedFlag();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(m_active_blocks_test_interval.step(dtime, 10.0))
|
||||
{
|
||||
//TimeTaker timer("envloop");
|
||||
ScopeProfiler sp(g_profiler, "SEnv: modify in blocks avg /10s", SPT_AVG);
|
||||
|
||||
for(core::map<v3s16, bool>::Iterator
|
||||
i = m_active_blocks.m_list.getIterator();
|
||||
i.atEnd()==false; i++)
|
||||
{
|
||||
v3s16 p = i.getNode()->getKey();
|
||||
|
||||
MapBlock *block = m_map->getBlockNoCreateNoEx(p);
|
||||
if(block==NULL)
|
||||
if (!nodestep)
|
||||
continue;
|
||||
|
||||
// Set current time as timestamp
|
||||
block->setTimestampNoChangedFlag(m_game_time);
|
||||
|
||||
/*
|
||||
Do stuff!
|
||||
|
||||
|
|
|
@ -314,6 +314,7 @@ private:
|
|||
IntervalLimiter m_active_blocks_management_interval;
|
||||
IntervalLimiter m_active_blocks_test_interval;
|
||||
IntervalLimiter m_active_blocks_nodemetadata_interval;
|
||||
IntervalLimiter m_active_blocks_circuit_interval;
|
||||
// Time from the beginning of the game in seconds.
|
||||
// Incremented in step().
|
||||
u32 m_game_time;
|
||||
|
|
|
@ -223,7 +223,23 @@ bool NodeMetadataList::step(float dtime, v3s16 blockpos_nodes, ServerEnvironment
|
|||
v3s16 p = i.getNode()->getKey();
|
||||
NodeMetadata *meta = i.getNode()->getValue();
|
||||
bool changed = meta->step(dtime, blockpos_nodes+p, env);
|
||||
if(changed)
|
||||
if (changed)
|
||||
something_changed = true;
|
||||
}
|
||||
return something_changed;
|
||||
}
|
||||
|
||||
bool NodeMetadataList::stepCircuit(float dtime, v3s16 blockpos_nodes, ServerEnvironment *env)
|
||||
{
|
||||
bool something_changed = false;
|
||||
for(core::map<v3s16, NodeMetadata*>::Iterator
|
||||
i = m_data.getIterator();
|
||||
i.atEnd()==false; i++)
|
||||
{
|
||||
v3s16 p = i.getNode()->getKey();
|
||||
NodeMetadata *meta = i.getNode()->getValue();
|
||||
bool changed = meta->stepCircuit(dtime, blockpos_nodes+p, env);
|
||||
if (changed)
|
||||
something_changed = true;
|
||||
}
|
||||
return something_changed;
|
||||
|
|
|
@ -69,6 +69,7 @@ public:
|
|||
virtual void inventoryModified(){}
|
||||
// A step in time. Returns true if metadata changed.
|
||||
virtual bool step(float dtime, v3s16 pos, ServerEnvironment *env) {return false;}
|
||||
virtual bool stepCircuit(float dtime, v3s16 pos, ServerEnvironment *env) {return false;}
|
||||
virtual bool nodeRemovalDisabled(){return false;}
|
||||
// Used to make custom inventory menus.
|
||||
// See format in guiInventoryMenu.cpp.
|
||||
|
@ -122,6 +123,7 @@ public:
|
|||
|
||||
// A step in time. Returns true if something changed.
|
||||
bool step(float dtime, v3s16 blockpos_nodes, ServerEnvironment *env);
|
||||
bool stepCircuit(float dtime, v3s16 blockpos_nodes, ServerEnvironment *env);
|
||||
|
||||
private:
|
||||
core::map<v3s16, NodeMetadata*> m_data;
|
||||
|
|
Loading…
Reference in New Issue