ns/dev/tankefugl/source/mod/AvHParticleTemplateServer.cpp

405 lines
11 KiB
C++

#include "util/nowarnings.h"
#include "mod/AvHParticleTemplateServer.h"
#include "dlls/util.h"
#include "util/STLUtil.h"
#include "mod/AvHParticleConstants.h"
void
AvHParticleTemplateListServer::Clear()
{
AvHParticleTemplateList::Clear();
this->mCreatedTemplates = false;
}
void
AvHParticleTemplateListServer::AddTemplatesFromFile(const string& inRelativeFileName)
{
}
bool
AvHParticleTemplateListServer::AddAttributesToTemplate(uint32 inTemplateIndex, const KeyValueData* inData)
{
// TODO: Implement this for avh_particles_custom entity
return false;
}
bool
AvHParticleTemplateListServer::CreateTemplates(const TRDescriptionList& inDescriptions)
{
bool theSuccess = false;
TRDescriptionList::const_iterator theIterator;
for(theIterator = inDescriptions.begin(); theIterator != inDescriptions.end(); theIterator++)
{
if(theIterator->GetType() == kpscSystemName)
{
// Create named particle system
AvHParticleTemplate theTemplate;
theTemplate.SetName(theIterator->GetName());
int theMaxParticles;
if(theIterator->GetTagValue(kpscNumParticles, theMaxParticles))
{
theTemplate.SetMaxParticles((uint32)theMaxParticles);
}
int theFlags;
if(theIterator->GetTagValue(kpscSpawnFlags, theFlags))
{
theTemplate.SetFlags(theFlags);
}
float theParticleSize;
if(theIterator->GetTagValue(kpscSize, theParticleSize))
{
theTemplate.SetParticleSize(theParticleSize);
}
//string theBaseColor;
//if(theIterator->GetTagValue(kpscBaseColor, theBaseColor))
//{
//}
float theParticleAnimationSpeed;
if(theIterator->GetTagValue(kpscAnimationSpeed, theParticleAnimationSpeed))
{
theTemplate.SetAnimationSpeed(theParticleAnimationSpeed);
}
float theParticleNumSpriteFrames;
if(theIterator->GetTagValue(kpscSpriteNumFrames, theParticleNumSpriteFrames))
{
theTemplate.SetNumSpriteFrames(theParticleNumSpriteFrames);
}
float theParticleSystemLifetime;
if(theIterator->GetTagValue(kpscSystemLifetime, theParticleSystemLifetime))
{
theTemplate.SetParticleSystemLifetime(theParticleSystemLifetime);
}
float theParticleLifetime;
if(theIterator->GetTagValue(kpscParticleLifetime, theParticleLifetime))
{
theTemplate.SetParticleLifetime(theParticleLifetime);
}
string theSprite;
if(theIterator->GetTagValue(kpscSprite, theSprite))
{
theTemplate.SetSprite(theSprite);
}
float theParticleScaling;
if(theIterator->GetTagValue(kpscScale, theParticleScaling))
{
theTemplate.SetParticleScaling(theParticleScaling);
}
int theParticleRenderMode;
if(theIterator->GetTagValue(kpscRendermode, theParticleRenderMode))
{
theTemplate.SetRenderMode(theParticleRenderMode);
}
int theParticleGenerationRate;
if(theIterator->GetTagValue(kpscGenRate, theParticleGenerationRate))
{
theTemplate.SetGenerationRate(theParticleGenerationRate);
}
string theGenerationShape;
if(theIterator->GetTagValue(kpscGenShape, theGenerationShape))
{
ShapeType theShape;
if(this->GetShapeTypeFromValue(theGenerationShape, theShape))
{
theTemplate.SetGenerationShape(theShape);
}
}
string theGenerationParameters;
if(theIterator->GetTagValue(kpscGenShapeParams, theGenerationParameters))
{
ParticleParams theParticleParams;
if(8 == sscanf(theGenerationParameters.c_str(), "%d,%d,%d,%d,%d,%d,%d,%d", theParticleParams+0, theParticleParams+1, theParticleParams+2,theParticleParams+3, theParticleParams+4, theParticleParams+5, theParticleParams+6, theParticleParams+7))
{
theTemplate.SetGenerationParams(theParticleParams);
}
}
string theStartingVelocityShape;
if(theIterator->GetTagValue(kpscVelocityShape, theStartingVelocityShape))
{
ShapeType theShape;
if(this->GetShapeTypeFromValue(theStartingVelocityShape, theShape))
{
theTemplate.SetStartingVelocityShape(theShape);
}
}
string theStartingVelocityParameters;
if(theIterator->GetTagValue(kpscVelocityParams, theStartingVelocityParameters))
{
ParticleParams theParticleParams;
if(8 == sscanf(theStartingVelocityParameters.c_str(), "%d,%d,%d,%d,%d,%d,%d,%d", theParticleParams+0, theParticleParams+1, theParticleParams+2,theParticleParams+3, theParticleParams+4, theParticleParams+5, theParticleParams+6, theParticleParams+7))
{
theTemplate.SetStartingVelocityParams(theParticleParams);
}
}
float theMaxAlpha;
if(theIterator->GetTagValue(kpscMaxAlpha, theMaxAlpha))
{
theTemplate.SetMaxAlpha(theMaxAlpha);
}
// float theParticleMinSpeed;
// if(theIterator->GetTagValue("particleMinSpeed", theParticleMinSpeed))
// {
// }
//
// float theParticleMaxSpeed;
// if(theIterator->GetTagValue("particleMaxSpeed", theParticleMaxSpeed))
// {
// }
//int theInitialParticles;
//if(theIterator->GetTagValue("particleInitialParticles", theInitialParticles))
//{
// theTemplate.SetInitialParticles(theInitialParticles);
//}
// TODO: Add flags into .ps
//int theFadeIn;
//if(theIterator->GetTagValue("particleFadeIn", theFadeIn))
//{
// if(theFadeIn)
// theTemplate.SetFadeIn();
//}
// Add it on the end
this->mTemplateList.insert(this->mTemplateList.end(), theTemplate);
theSuccess = true;
}
}
this->mCreatedTemplates = theSuccess;
return theSuccess;
}
bool
AvHParticleTemplateListServer::CreateTemplate(const KeyValueData* inData, uint32& outIndex)
{
// TODO: Implement this for avh_particles_custom entity
return false;
}
bool
AvHParticleTemplateListServer::GetCreatedTemplates(void) const
{
return this->mCreatedTemplates;
}
bool
AvHParticleTemplateListServer::GetTemplateIndexWithName(const string& inName, uint32& outIndex) const
{
ParticleTemplateListType::const_iterator theIterator;
uint32 theIndex = 0;
bool theSuccess = false;
string theLowercaseInName = LowercaseString(inName);
for(theIterator = this->mTemplateList.begin(); theIterator != this->mTemplateList.end(); theIterator++, theIndex++)
{
string theLowercaseTemplateName = LowercaseString(theIterator->GetName());
// Make case-insensitive?
if(theLowercaseInName == theLowercaseTemplateName)
{
outIndex = theIndex;
theSuccess = true;
break;
}
}
return theSuccess;
}
bool
AvHParticleTemplateListServer::GetShapeTypeFromValue(const string& inValueName, ShapeType& outShape)
{
bool theSuccess = false;
if(inValueName == "Point")
{
outShape = PS_Point;
theSuccess = true;
}
else if(inValueName == "Cone")
{
outShape = PS_Cone;
theSuccess = true;
}
else if(inValueName == "Box")
{
outShape = PS_Box;
theSuccess = true;
}
return theSuccess;
}
void
AvHParticleTemplateListServer::LinkToEntities(AvHParticleTemplate* inTemplate)
{
// Look up entity names and matchup to indices
string theEntityName = inTemplate->GetGenerationEntityName();
const char* theEntityNameCStr = theEntityName.c_str();
if(!FStrEq(theEntityNameCStr, ""))
{
edict_t* theEdict = FIND_ENTITY_BY_TARGETNAME(NULL, theEntityNameCStr);
if(!FNullEnt(theEdict))
{
int theEntityIndex = ENTINDEX(theEdict);
inTemplate->SetGenerationEntityIndex(theEntityIndex);
}
}
string theParticleSystemToGenerate = inTemplate->GetParticleSystemToGenerate();
if(!FStrEq(theParticleSystemToGenerate.c_str(), ""))
{
// Lookup particle system and remember index
uint32 theIndex = -1;
if(this->GetTemplateIndexWithName(theParticleSystemToGenerate, theIndex))
{
inTemplate->SetParticleSystemIndexToGenerate(theIndex);
}
}
}
bool
AvHParticleTemplateListServer::SendToNetworkStream()
{
bool theSuccess = false;
if(this->mCreatedTemplates)
{
int theNumTemplates = this->mTemplateList.size();
// Send number of particle templates
WRITE_LONG(theNumTemplates);
// For each one
for(int theLoop = 0; theLoop < theNumTemplates; theLoop++)
{
// Send it
const AvHParticleTemplate* theTemplate = this->GetTemplateAtIndex(theLoop);
if(theTemplate)
{
this->SendTemplateToNetworkStream(theTemplate);
}
else
{
// Emit some error
}
theSuccess = true;
}
}
return theSuccess;
}
void
AvHParticleTemplateListServer::SendTemplateToNetworkStream(const AvHParticleTemplate* inTemplate)
{
int theLoop;
// send name of PS...necessary?
WRITE_STRING(inTemplate->GetName().c_str());
// Send max particles
WRITE_LONG(inTemplate->GetMaxParticles());
// Send particle size
WRITE_COORD(inTemplate->GetParticleSize());
// Send sprite
WRITE_STRING(inTemplate->GetSprite().c_str());
// Write system lifetime
WRITE_COORD(inTemplate->GetParticleSystemLifetime());
// Write particle lifetime
WRITE_COORD(inTemplate->GetParticleLifetime());
// Animation speed
WRITE_COORD(inTemplate->GetAnimationSpeed());
// Num frames in sprite
WRITE_BYTE(inTemplate->GetNumSpriteFrames());
// Particle scaling
WRITE_COORD(inTemplate->GetParticleScaling());
// Render mode
WRITE_BYTE(inTemplate->GetRenderMode());
// Write gen rate as long
WRITE_LONG(inTemplate->GetGenerationRate());
// Write shape as char
WRITE_BYTE((char)(inTemplate->GetGenerationShape()));
// Write the generation params as 8 longs
ParticleParams theGenParams;
inTemplate->GetGenerationParams(theGenParams);
for(theLoop = 0; theLoop < 8; theLoop++)
{
WRITE_LONG(theGenParams[theLoop]);
}
// Send generation entity name (if any)
WRITE_LONG(inTemplate->GetGenerationEntityIndex());
// Send generation entity param
WRITE_COORD(inTemplate->GetGenerationEntityParameter());
// Send starting velocity shape
WRITE_BYTE(inTemplate->GetStartingVelocityShape());
// Send starting velocity params
ParticleParams theVelParams;
inTemplate->GetStartingVelocityParams(theVelParams);
for(theLoop = 0; theLoop < 8; theLoop++)
{
WRITE_LONG(theVelParams[theLoop]);
}
// Write gravity as three floats
PSVector theGravity;
inTemplate->GetGravity(theGravity);
for(theLoop = 0; theLoop < 3; theLoop++)
{
WRITE_COORD(theGravity[theLoop]);
}
// Write number initial particles
//WRITE_LONG(inTemplate->GetInitialParticles());
float theMaxAlpha = inTemplate->GetMaxAlpha();
WRITE_COORD(theMaxAlpha);
// Send index of ps to generate
int theParticleSystemIndexToGenerate = inTemplate->GetParticleSystemIndexToGenerate();
WRITE_LONG(theParticleSystemIndexToGenerate);
// Write flags
int theFlags = inTemplate->GetFlags();
WRITE_LONG(theFlags);
}