forked from oerkki/voxelands
add delayed repeater, make gates propagate light
This commit is contained in:
parent
6fdc36cbea
commit
24dd10506d
Binary file not shown.
After Width: | Height: | Size: 583 B |
Binary file not shown.
After Width: | Height: | Size: 681 B |
|
@ -553,6 +553,7 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
|
|||
#define CONTENT_CIRCUIT_BUTTON 0xF25
|
||||
#define CONTENT_CIRCUIT_PRESSUREPLATE_WOOD 0xF26
|
||||
#define CONTENT_CIRCUIT_PRESSUREPLATE_STONE 0xF27
|
||||
#define CONTENT_CIRCUIT_REPEATER 0xF28
|
||||
// circuits - gadgets
|
||||
#define CONTENT_CIRCUIT_LAMP 0xF40
|
||||
#define CONTENT_CIRCUIT_LAMP_OFF 0xF41
|
||||
|
|
|
@ -293,9 +293,9 @@ void content_mapnode_circuit(bool repeat)
|
|||
f->setAllTextures("circuit_gate.png");
|
||||
f->setTexture(0,"circuit_gate_top.png");
|
||||
f->rotate_tile_with_nodebox = true;
|
||||
f->param_type = CPT_FACEDIR_SIMPLE;
|
||||
f->param_type = CPT_LIGHT;
|
||||
f->param2_type = CPT_FACEDIR_SIMPLE;
|
||||
f->draw_type = CDT_NODEBOX;
|
||||
f->is_ground_content = true;
|
||||
f->energy_type = CET_GATE;
|
||||
f->energy_drop = 0;
|
||||
f->solidness = 0; // drawn separately, makes no faces
|
||||
|
@ -317,6 +317,36 @@ void content_mapnode_circuit(bool repeat)
|
|||
lists::add("craftguide",i);
|
||||
lists::add("creative",i);
|
||||
|
||||
i = CONTENT_CIRCUIT_REPEATER;
|
||||
f = &content_features(i);
|
||||
f->description = std::string("Repeater");
|
||||
f->setAllTextures("circuit_repeater.png");
|
||||
f->setTexture(0,"circuit_repeater_top.png");
|
||||
f->rotate_tile_with_nodebox = true;
|
||||
f->param_type = CPT_LIGHT;
|
||||
f->param2_type = CPT_FACEDIR_SIMPLE;
|
||||
f->draw_type = CDT_NODEBOX;
|
||||
f->energy_type = CET_GATE;
|
||||
f->energy_drop = 0;
|
||||
f->solidness = 0; // drawn separately, makes no faces
|
||||
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
|
||||
f->type = CMT_STONE;
|
||||
f->hardness = 1.0;
|
||||
content_nodebox_logicgate(f);
|
||||
f->setInventoryTextureNodeBox(i,"circuit_repeater_top.png","circuit_repeater.png","circuit_repeater.png");
|
||||
if (f->initial_metadata == NULL)
|
||||
f->initial_metadata = new RepeaterNodeMetadata();
|
||||
{
|
||||
u16 recipe[9] = {
|
||||
CONTENT_IGNORE, CONTENT_IGNORE, CONTENT_IGNORE,
|
||||
CONTENT_CRAFTITEM_MESEDUST, CONTENT_STONE, CONTENT_CRAFTITEM_MESEDUST,
|
||||
CONTENT_IGNORE, CONTENT_IGNORE, CONTENT_IGNORE
|
||||
};
|
||||
crafting::setRecipe(recipe,CONTENT_CIRCUIT_REPEATER,1);
|
||||
}
|
||||
lists::add("craftguide",i);
|
||||
lists::add("creative",i);
|
||||
|
||||
i = CONTENT_CIRCUIT_LAMP;
|
||||
f = &content_features(i);
|
||||
f->description = std::string("Electric Lamp");
|
||||
|
|
|
@ -2597,6 +2597,106 @@ bool NotGateNodeMetadata::energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3
|
|||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
RepeaterNodeMetadata
|
||||
*/
|
||||
|
||||
// Prototype
|
||||
RepeaterNodeMetadata proto_RepeaterNodeMetadata;
|
||||
|
||||
RepeaterNodeMetadata::RepeaterNodeMetadata():
|
||||
m_ticks(0)
|
||||
{
|
||||
m_energy = 0;
|
||||
m_ptime = 0;
|
||||
m_sources.clear();
|
||||
NodeMetadata::registerType(typeId(), create);
|
||||
}
|
||||
u16 RepeaterNodeMetadata::typeId() const
|
||||
{
|
||||
return CONTENT_CIRCUIT_REPEATER;
|
||||
}
|
||||
NodeMetadata* RepeaterNodeMetadata::create(std::istream &is)
|
||||
{
|
||||
RepeaterNodeMetadata *d = new RepeaterNodeMetadata();
|
||||
int temp;
|
||||
is>>temp;
|
||||
d->m_energy = temp;
|
||||
is>>temp;
|
||||
d->m_ticks = temp;
|
||||
is>>temp;
|
||||
d->m_ptime = (float)temp/10;
|
||||
int i;
|
||||
is>>i;
|
||||
v3s16 p;
|
||||
for (; i > 0; i--) {
|
||||
is>>temp;
|
||||
p.X = temp;
|
||||
is>>temp;
|
||||
p.Y = temp;
|
||||
is>>temp;
|
||||
p.Z = temp;
|
||||
is>>temp;
|
||||
d->m_sources[p] = temp;
|
||||
}
|
||||
return d;
|
||||
}
|
||||
NodeMetadata* RepeaterNodeMetadata::clone()
|
||||
{
|
||||
RepeaterNodeMetadata *d = new RepeaterNodeMetadata();
|
||||
return d;
|
||||
}
|
||||
void RepeaterNodeMetadata::serializeBody(std::ostream &os)
|
||||
{
|
||||
os<<itos(m_energy) << " ";
|
||||
os<<itos(m_ticks) << " ";
|
||||
os<<itos(m_ptime*10)<<" ";
|
||||
os<<itos(m_sources.size()) << " ";
|
||||
for (std::map<v3s16,u8>::iterator i = m_sources.begin(); i != m_sources.end(); i++) {
|
||||
os<<itos(i->first.X) << " ";
|
||||
os<<itos(i->first.Y) << " ";
|
||||
os<<itos(i->first.Z) << " ";
|
||||
os<<itos(i->second) << " ";
|
||||
}
|
||||
}
|
||||
bool RepeaterNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env)
|
||||
{
|
||||
m_ptime += dtime;
|
||||
if (m_ptime > 1.0 && m_ticks > 0) {
|
||||
m_energy = 0;
|
||||
m_ticks--;
|
||||
}
|
||||
if (!m_energy && !m_ticks) {
|
||||
return false;
|
||||
}else if (m_energy && m_ticks < 3) {
|
||||
m_ticks++;
|
||||
return true;
|
||||
}
|
||||
|
||||
env->propogateEnergy(ENERGY_MAX,pos,pos,pos);
|
||||
return true;
|
||||
}
|
||||
bool RepeaterNodeMetadata::energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos)
|
||||
{
|
||||
if (powersrc == pos)
|
||||
return true;
|
||||
m_ptime = 0;
|
||||
if (level && m_sources[powersrc] > level)
|
||||
return false;
|
||||
if (!level || m_energy < level) {
|
||||
m_energy = level;
|
||||
if (!level) {
|
||||
m_sources.erase(powersrc);
|
||||
for (std::map<v3s16,u8>::iterator i = m_sources.begin(); i != m_sources.end(); i++) {
|
||||
u8 v = i->second;
|
||||
if (v > m_energy)
|
||||
m_energy = v;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
DoorNodeMetadata
|
||||
|
|
|
@ -532,6 +532,20 @@ public:
|
|||
virtual bool energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
};
|
||||
|
||||
class RepeaterNodeMetadata : public CircuitNodeMetadata
|
||||
{
|
||||
public:
|
||||
RepeaterNodeMetadata();
|
||||
virtual u16 typeId() const;
|
||||
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 energise(u8 level, v3s16 powersrc, v3s16 signalsrc, v3s16 pos);
|
||||
private:
|
||||
u8 m_ticks;
|
||||
};
|
||||
|
||||
class NotGateNodeMetadata : public CircuitNodeMetadata
|
||||
{
|
||||
public:
|
||||
|
|
Loading…
Reference in New Issue