Water pump object is a power cell charger (including nuclear), with an animation, custom model, and collision
parent
346c2ee1f3
commit
8e54962c65
|
@ -89,7 +89,7 @@ CObjectUPtr CObjectFactory::CreateObject(const ObjectCreateParams& params)
|
||||||
return CExchangePost::Create(params, m_oldModelManager, m_engine);
|
return CExchangePost::Create(params, m_oldModelManager, m_engine);
|
||||||
|
|
||||||
case OBJECT_WATERPUMP:
|
case OBJECT_WATERPUMP:
|
||||||
return CWaterPump::Create(params, m_oldModelManager, m_engine);
|
return CreateObjectWaterPump(params, m_oldModelManager, m_modelManager, m_engine);
|
||||||
|
|
||||||
case OBJECT_PORTICO:
|
case OBJECT_PORTICO:
|
||||||
case OBJECT_BASE:
|
case OBJECT_BASE:
|
||||||
|
|
|
@ -747,7 +747,8 @@ void COldObject::SetType(ObjectType type)
|
||||||
m_type == OBJECT_RESEARCH ||
|
m_type == OBJECT_RESEARCH ||
|
||||||
m_type == OBJECT_ENERGY ||
|
m_type == OBJECT_ENERGY ||
|
||||||
m_type == OBJECT_LABO ||
|
m_type == OBJECT_LABO ||
|
||||||
m_type == OBJECT_NUCLEAR )
|
m_type == OBJECT_NUCLEAR ||
|
||||||
|
m_type == OBJECT_WATERPUMP)
|
||||||
{
|
{
|
||||||
m_implementedInterfaces[static_cast<int>(ObjectInterfaceType::Powered)] = true;
|
m_implementedInterfaces[static_cast<int>(ObjectInterfaceType::Powered)] = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,8 @@
|
||||||
#include "common/make_unique.h"
|
#include "common/make_unique.h"
|
||||||
#include "common/regex_utils.h"
|
#include "common/regex_utils.h"
|
||||||
|
|
||||||
#include "graphics/engine/oldmodelmanager.h"
|
#include "graphics/engine/oldmodelmanager.h" // XXX delete
|
||||||
|
#include "graphics/model/model_manager.h"
|
||||||
|
|
||||||
#include "level/parser/parserexceptions.h"
|
#include "level/parser/parserexceptions.h"
|
||||||
#include "level/parser/parserline.h"
|
#include "level/parser/parserline.h"
|
||||||
|
@ -38,41 +39,74 @@
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
|
class CWaterPump : public CBaseBuilding
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CWaterPump(int id)
|
||||||
|
: CBaseBuilding(id, OBJECT_WATERPUMP)
|
||||||
|
{
|
||||||
|
m_implementedInterfaces[static_cast<int>(ObjectInterfaceType::Powered)] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Write(CLevelParserLine* line) override;
|
||||||
|
void Read(CLevelParserLine* line) override;
|
||||||
|
|
||||||
|
using COldObject::SetAuto;
|
||||||
|
};
|
||||||
|
|
||||||
struct CAutoWaterPump : public CAuto
|
struct CAutoWaterPump : public CAuto
|
||||||
{
|
{
|
||||||
CAutoWaterPump(CWaterPump* object) : CAuto(object) {}
|
CAutoWaterPump(CWaterPump* object) : CAuto(object) {}
|
||||||
~CAutoWaterPump() {}
|
~CAutoWaterPump() {}
|
||||||
|
|
||||||
|
float cycle = 0.0f;
|
||||||
|
|
||||||
bool EventProcess(const Event &event) override {
|
bool EventProcess(const Event &event) override {
|
||||||
CAuto::EventProcess(event);
|
CAuto::EventProcess(event);
|
||||||
if (event.type == EVENT_FRAME && !m_engine->GetPause()) {
|
if (event.type == EVENT_FRAME && !m_engine->GetPause()) {
|
||||||
float angle = m_object->GetPartRotationY(1);
|
CObject *powerCell = m_object->GetPower();
|
||||||
angle += event.rTime*0.5f;
|
if (powerCell != nullptr) {
|
||||||
m_object->SetPartRotationY(1, fmodf(angle, Math::PI*2.0f));
|
|
||||||
m_object->SetPartPosition(1, Math::Vector(0.0f, 2.0f + sinf(angle), 0.0f));
|
if (powerCell->Implements(ObjectInterfaceType::PowerContainer)) {
|
||||||
|
CPowerContainerObject *asPC = dynamic_cast<CPowerContainerObject*>(powerCell);
|
||||||
|
float energy = asPC->GetEnergyLevel();
|
||||||
|
energy += (0.2f * event.rTime) / asPC->GetCapacity();
|
||||||
|
asPC->SetEnergyLevel(energy);
|
||||||
|
}
|
||||||
|
|
||||||
|
cycle = fmodf(cycle + event.rTime, 1.0f);
|
||||||
|
if (cycle < 0.5f)
|
||||||
|
m_object->SetPartPosition(1, Math::Vector(0.0f, 4.0f * cycle + 1.5f, 0.0f));
|
||||||
|
else
|
||||||
|
m_object->SetPartPosition(1, Math::Vector(0.0f, 4.0f - (4.0f * cycle) + 1.5f, 0.0f));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true; // XXX what does this mean?
|
return true; // XXX what does this mean?
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CWaterPump::CWaterPump(int id)
|
std::unique_ptr<CObject> CreateObjectWaterPump(
|
||||||
: CBaseBuilding(id, OBJECT_WATERPUMP)
|
|
||||||
{}
|
|
||||||
|
|
||||||
std::unique_ptr<CWaterPump> CWaterPump::Create(
|
|
||||||
const ObjectCreateParams& params,
|
const ObjectCreateParams& params,
|
||||||
Gfx::COldModelManager* modelManager,
|
Gfx::COldModelManager* oldModelManager, // XXX remove
|
||||||
|
Gfx::CModelManager* modelManager,
|
||||||
Gfx::CEngine* engine)
|
Gfx::CEngine* engine)
|
||||||
{
|
{
|
||||||
auto obj = MakeUnique<CWaterPump>(params.id);
|
auto obj = MakeUnique<CWaterPump>(params.id);
|
||||||
|
|
||||||
obj->SetTeam(params.team);
|
obj->SetTeam(params.team);
|
||||||
|
|
||||||
|
/*static int info1_base_rank = -1;
|
||||||
|
if (info1_base_rank == -1) {
|
||||||
|
Gfx::CModel& model_info1 = modelManager->GetModel("info1");
|
||||||
|
info1_base_rank = engine->CreateBaseObject();
|
||||||
|
engine->AddBaseObjTriangles(info1_base_rank, model_info1.GetMesh("main")->GetTriangles());
|
||||||
|
}*/
|
||||||
|
|
||||||
int rank = engine->CreateObject();
|
int rank = engine->CreateObject();
|
||||||
engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); // it is a stationary object
|
engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); // it is a stationary object
|
||||||
obj->SetObjectRank(0, rank);
|
obj->SetObjectRank(0, rank);
|
||||||
modelManager->AddModelReference("info1.mod", false, rank);
|
//engine->SetObjectBaseRank(rank, info1_base_rank);
|
||||||
|
oldModelManager->AddModelReference("waterpump.txt", false, rank);
|
||||||
obj->SetPosition(params.pos);
|
obj->SetPosition(params.pos);
|
||||||
obj->SetRotationY(params.angle);
|
obj->SetRotationY(params.angle);
|
||||||
obj->SetFloorHeight(0.0f);
|
obj->SetFloorHeight(0.0f);
|
||||||
|
@ -81,39 +115,15 @@ std::unique_ptr<CWaterPump> CWaterPump::Create(
|
||||||
engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT);
|
engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT);
|
||||||
obj->SetObjectRank(1, rank);
|
obj->SetObjectRank(1, rank);
|
||||||
obj->SetObjectParent(1, 0);
|
obj->SetObjectParent(1, 0);
|
||||||
modelManager->AddModelReference("info1.mod", false, rank);
|
//engine->SetObjectBaseRank(rank, info1_base_rank);
|
||||||
|
oldModelManager->AddModelReference("info2.mod", false, rank);
|
||||||
obj->SetPartPosition(1, Math::Vector(0.0f, 1.0f, 0.0f));
|
obj->SetPartPosition(1, Math::Vector(0.0f, 1.0f, 0.0f));
|
||||||
obj->SetPartRotationY(1, 0.0f);
|
obj->SetPartRotationY(1, 0.0f);
|
||||||
|
|
||||||
/* rank = engine->CreateObject();
|
|
||||||
engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT);
|
|
||||||
obj->SetObjectRank(1, rank);
|
|
||||||
obj->SetObjectParent(1, 0);
|
|
||||||
modelManager->AddModelReference("info2.mod", false, rank);
|
|
||||||
obj->SetPartPosition(1, Math::Vector(0.0f, 5.0f, 0.0f));
|
|
||||||
|
|
||||||
for (int i = 0; i < 3; ++i)
|
|
||||||
{
|
|
||||||
rank = engine->CreateObject();
|
|
||||||
engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT);
|
|
||||||
obj->SetObjectRank(2+i*2, rank);
|
|
||||||
obj->SetObjectParent(2+i*2, 1);
|
|
||||||
modelManager->AddModelReference("info3.mod", false, rank);
|
|
||||||
obj->SetPartPosition(2+i*2, Math::Vector(0.0f, 4.5f, 0.0f));
|
|
||||||
|
|
||||||
rank = engine->CreateObject();
|
|
||||||
engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT);
|
|
||||||
obj->SetObjectRank(3+i*2, rank);
|
|
||||||
obj->SetObjectParent(3+i*2, 2+i*2);
|
|
||||||
modelManager->AddModelReference("radar4.mod", false, rank);
|
|
||||||
obj->SetPartPosition(3+i*2, Math::Vector(0.0f, 0.0f, -4.0f));
|
|
||||||
|
|
||||||
obj->SetPartRotationY(2+i*2, 2.0f*Math::PI/3.0f*i);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 3.0f, 0.0f), 6.0f, SOUND_BOUMm, 0.45f));
|
obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 3.0f, 0.0f), 6.0f, SOUND_BOUMm, 0.45f));
|
||||||
obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 11.0f, 0.0f), 6.0f, SOUND_BOUMm, 0.45f));
|
obj->AddCrashSphere(CrashSphere(Math::Vector(7.0f, 1.0f, 0.0f), 1.5f, SOUND_BOUMm, 0.45f));
|
||||||
obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 5.0f, 0.0f), 6.0f));
|
obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 5.0f, 0.0f), 6.0f));
|
||||||
|
obj->SetPowerPosition(Math::Vector(7.0, 2.5, 0.0));
|
||||||
|
|
||||||
obj->CreateShadowCircle(8.0f, 1.0f);
|
obj->CreateShadowCircle(8.0f, 1.0f);
|
||||||
|
|
||||||
|
|
|
@ -34,23 +34,16 @@ struct ObjectCreateParams;
|
||||||
namespace Gfx
|
namespace Gfx
|
||||||
{
|
{
|
||||||
class COldModelManager;
|
class COldModelManager;
|
||||||
|
class CModelManager;
|
||||||
class CEngine;
|
class CEngine;
|
||||||
}
|
}
|
||||||
|
|
||||||
class CWaterPump : public CBaseBuilding
|
std::unique_ptr<CObject> CreateObjectWaterPump(
|
||||||
{
|
|
||||||
public:
|
|
||||||
CWaterPump(int id);
|
|
||||||
|
|
||||||
static std::unique_ptr<CWaterPump> Create(
|
|
||||||
const ObjectCreateParams& params,
|
const ObjectCreateParams& params,
|
||||||
Gfx::COldModelManager* modelManager,
|
Gfx::COldModelManager* oldModelManager,
|
||||||
|
Gfx::CModelManager* modelManager,
|
||||||
Gfx::CEngine* engine);
|
Gfx::CEngine* engine);
|
||||||
|
|
||||||
void Write(CLevelParserLine* line) override;
|
|
||||||
void Read(CLevelParserLine* line) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
// TODO: integrate this with CExchangePost
|
// TODO: integrate this with CExchangePost
|
||||||
/*class CAutoInfo : public CAuto
|
/*class CAutoInfo : public CAuto
|
||||||
{
|
{
|
||||||
|
|
|
@ -931,6 +931,10 @@ CObject* CTaskManip::SearchOtherObject(bool bAdvance, Math::Vector &pos,
|
||||||
{
|
{
|
||||||
oLimit = 45.0f*Math::PI/180.0f;
|
oLimit = 45.0f*Math::PI/180.0f;
|
||||||
}
|
}
|
||||||
|
else if ( type == OBJECT_WATERPUMP )
|
||||||
|
{
|
||||||
|
oLimit = 3; //Math::PI doesn't work
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
oLimit = 45.0f*Math::PI/180.0f;
|
oLimit = 45.0f*Math::PI/180.0f;
|
||||||
|
|
Loading…
Reference in New Issue