decrease circuit step time, and optimise the active block code a bit

This commit is contained in:
darkrose 2014-09-23 23:31:05 +10:00
parent 1f85a106b3
commit fed63b5e1a
7 changed files with 76 additions and 95 deletions

View File

@ -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");

View File

@ -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;

View File

@ -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);

View File

@ -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!

View File

@ -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;

View File

@ -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;

View File

@ -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;