📄 simbase.cc
字号:
//}
void SimObject::write(Stream &stream, U32 tabStop, U32 flags)
{
// Only output selected objects if they want that.
if((flags & SelectedOnly) && !isSelected())
return;
bool objExists;
if (flags & ObjectExists)
objExists = true;
else
objExists = false;
writeTabs(stream, tabStop);
char buffer[1024];
if (objExists)
{
// added for Theme Editor support. Object must be named to work properly.
if (getName())
{
dSprintf(buffer, sizeof(buffer), "if (!isObject(%s))\r\n", getName());
stream.write(dStrlen(buffer), buffer);
writeTabs(stream, tabStop+1);
dSprintf(buffer, sizeof(buffer), "new %s(%s); \r\n", getClassName(), getName());
stream.write(dStrlen(buffer), buffer);
}
}
else
{
dSprintf(buffer, sizeof(buffer), "new %s(%s)\r\n", getClassName(), getName() ? getName() : "");
stream.write(dStrlen(buffer), buffer);
writeTabs(stream, tabStop);
stream.write(3, "{\r\n");
}
writeFields(stream, tabStop + 1, flags);
writeTabs(stream, tabStop);
///TGE_Theme
dSprintf(buffer, sizeof(buffer), "%s// new %s(%s)\r\n",
!objExists?"};" : "" ,
//objExists?"};" : "" ,
getClassName(),
getName() ? getName() : "");
stream.write(dStrlen(buffer), buffer);
}
#ifdef TGE_RPG
SimObject* SimObject::duplicate(bool bWithChildren,bool bRegister)
{
bWithChildren;
SimObject* pNew = (SimObject*)Parent::create(getClassName());
pNew->assignFieldsFrom(this);
if(mFlags.test(ModStaticFields))
pNew->setModStaticFields(true);
if(mFlags.test(ModDynamicFields))
pNew->setModDynamicFields(true);
if(bRegister)
pNew->registerObject();
return pNew;
}
#endif
ConsoleFunctionGroupBegin ( SimFunctions, "Functions relating to Sim.");
ConsoleFunction(nameToID, S32, 2, 2, "nameToID(object)")
{
argc;
SimObject *obj = Sim::findObject(argv[1]);
if(obj)
return obj->getId();
else
return -1;
}
ConsoleFunction(isObject, bool, 2, 2, "isObject(object)")
{
argc;
if (!dStrcmp(argv[1], "0") || !dStrcmp(argv[1], ""))
return false;
else
return (Sim::findObject(argv[1]) != NULL);
}
ConsoleFunction(cancel,void,2,2,"cancel(eventId)")
{
argc;
Sim::cancelEvent(dAtoi(argv[1]));
}
ConsoleFunction(isEventPending, bool, 2, 2, "isEventPending(%scheduleId);")
{
argc;
return Sim::isEventPending(dAtoi(argv[1]));
}
ConsoleFunction(getEventTimeLeft, S32, 2, 2, "getEventTimeLeft(scheduleId) Get the time left in ms until this event will trigger.")
{
return Sim::getEventTimeLeft(dAtoi(argv[1]));
}
ConsoleFunction(getScheduleDuration, S32, 2, 2, "getTimeSinceStart(%scheduleId);")
{
argc; S32 ret = Sim::getScheduleDuration(dAtoi(argv[1]));
return ret;
}
ConsoleFunction(getTimeSinceStart, S32, 2, 2, "getTimeSinceStart(%scheduleId);")
{
argc; S32 ret = Sim::getTimeSinceStart(dAtoi(argv[1]));
return ret;
}
ConsoleFunction(schedule, S32, 4, 0, "schedule(time, refobject|0, command, <arg1...argN>)")
{
U32 timeDelta = U32(dAtof(argv[1]));
SimObject *refObject = Sim::findObject(argv[2]);
if(!refObject)
{
if(argv[2][0] != '0')
return 0;
refObject = Sim::getRootGroup();
}
SimConsoleEvent *evt = new SimConsoleEvent(argc - 3, argv + 3, false);
S32 ret = Sim::postEvent(refObject, evt, Sim::getCurrentTime() + timeDelta);
// #ifdef DEBUG
// Con::printf("ref %s schedule(%s) = %d", argv[2], argv[3], ret);
// Con::executef(1, "backtrace");
// #endif
return ret;
}
ConsoleFunctionGroupEnd( SimFunctions );
ConsoleMethod(SimObject, save, bool, 3, 4, "obj.save(fileName, <selectedOnly>)")
{
static const char *beginMessage = "//--- OBJECT WRITE BEGIN ---";
static const char *endMessage = "//--- OBJECT WRITE END ---";
FileStream stream;
FileObject f;
f.readMemory(argv[2]);
// check for flags <selected, ...>
U32 writeFlags = 0;
if(argc > 3)
{
if(dAtob(argv[3]))
writeFlags |= SimObject::SelectedOnly;
}
if(!ResourceManager->openFileForWrite(stream, argv[2]))
return false;
char docRoot[256];
char modRoot[256];
dStrcpy(docRoot, argv[2]);
char *p = dStrrchr(docRoot, '/');
if (p) *++p = '\0';
else docRoot[0] = '\0';
dStrcpy(modRoot, argv[2]);
p = dStrchr(modRoot, '/');
if (p) *++p = '\0';
else modRoot[0] = '\0';
Con::setVariable("$DocRoot", docRoot);
Con::setVariable("$ModRoot", modRoot);
const char *buffer;
while(!f.isEOF())
{
buffer = (const char *) f.readLine();
if(!dStrcmp(buffer, beginMessage))
break;
stream.write(dStrlen(buffer), buffer);
stream.write(2, "\r\n");
}
stream.write(dStrlen(beginMessage), beginMessage);
stream.write(2, "\r\n");
object->write(stream, 0, writeFlags);
stream.write(dStrlen(endMessage), endMessage);
stream.write(2, "\r\n");
while(!f.isEOF())
{
buffer = (const char *) f.readLine();
if(!dStrcmp(buffer, endMessage))
break;
}
while(!f.isEOF())
{
buffer = (const char *) f.readLine();
stream.write(dStrlen(buffer), buffer);
stream.write(2, "\r\n");
}
Con::setVariable("$DocRoot", NULL);
Con::setVariable("$ModRoot", NULL);
return true;
}
ConsoleMethod(SimObject, setName, void, 3, 3, "obj.setName(newName)")
{
argc;
object->assignName(argv[2]);
}
ConsoleMethod(SimObject, getName, const char *, 2, 2, "obj.getName()")
{
argc; argv;
const char *ret = object->getName();
return ret ? ret : "";
}
ConsoleMethod(SimObject, getClassName, const char *, 2, 2, "obj.getClassName()")
{
argc; argv;
const char *ret = object->getClassName();
return ret ? ret : "";
}
ConsoleMethod(SimObject, getId, S32, 2, 2, "obj.getId()")
{
argc; argv;
return object->getId();
}
ConsoleMethod(SimObject, getGroup, S32, 2, 2, "obj.getGroup()")
{
argc; argv;
SimGroup *grp = object->getGroup();
if(!grp)
return -1;
return grp->getId();
}
ConsoleMethod(SimObject, delete, void, 2, 2,"obj.delete()")
{
argc;argv;
object->deleteObject();
}
ConsoleMethod(SimObject,schedule, S32, 4, 0, "object.schedule(time, command, <arg1...argN>);")
{
U32 timeDelta = U32(dAtof(argv[2]));
argv[2] = argv[3];
argv[3] = argv[1];
SimConsoleEvent *evt = new SimConsoleEvent(argc - 2, argv + 2, true);
S32 ret = Sim::postEvent(object, evt, Sim::getCurrentTime() + timeDelta);
// #ifdef DEBUG
// Con::printf("obj %s schedule(%s) = %d", argv[3], argv[2], ret);
// Con::executef(1, "backtrace");
// #endif
return ret;
}
static S32 QSORT_CALLBACK compareFields(const void* a,const void* b)
{
const AbstractClassRep::Field* fa = *((const AbstractClassRep::Field**)a);
const AbstractClassRep::Field* fb = *((const AbstractClassRep::Field**)b);
return dStricmp(fa->pFieldname, fb->pFieldname);
}
ConsoleMethod(SimObject,dump, void, 2, 2, "obj.dump()")
{
argc; argv;
const AbstractClassRep::FieldList &list = object->getFieldList();
char expandedBuffer[1024];
Con::printf("Member Fields:");
Vector<const AbstractClassRep::Field *> flist(__FILE__, __LINE__);
for(U32 i = 0; i < list.size(); i++)
flist.push_back(&list[i]);
dQsort(flist.address(),flist.size(),sizeof(AbstractClassRep::Field *),compareFields);
for(Vector<const AbstractClassRep::Field *>::iterator itr = flist.begin(); itr != flist.end(); itr++)
{
const AbstractClassRep::Field* f = *itr;
if( f->type == AbstractClassRep::DepricatedFieldType ||
f->type == AbstractClassRep::StartGroupFieldType ||
f->type == AbstractClassRep::EndGroupFieldType) continue;
for(U32 j = 0; S32(j) < f->elementCount; j++)
{
const char *val = Con::getData(f->type, (void *) (((const char *)object) + f->offset), j, f->table, f->flag);
if(!val /*|| !*val*/)
continue;
if(f->elementCount == 1)
dSprintf(expandedBuffer, sizeof(expandedBuffer), " %s = \"", f->pFieldname);
else
dSprintf(expandedBuffer, sizeof(expandedBuffer), " %s[%d] = \"", f->pFieldname, j);
expandEscape(expandedBuffer + dStrlen(expandedBuffer), val);
Con::printf("%s\"", expandedBuffer);
}
}
Con::printf("Tagged Fields:");
if(object->getFieldDictionary())
object->getFieldDictionary()->printFields(object);
Con::printf("Methods:");
Namespace *ns = object->getNamespace();
Vector<Namespace::Entry *> vec(__FILE__, __LINE__);
if(ns)
ns->getEntryList(&vec);
for(Vector<Namespace::Entry *>::iterator j = vec.begin(); j != vec.end(); j++)
Con::printf(" %s() - %s", (*j)->mFunctionName, (*j)->mUsage ? (*j)->mUsage : "");
}
ConsoleMethod(SimObject, getType, S32, 2, 2, "obj.getType()")
{
argc; argv;
return((S32)object->getType());
}
const char *SimObject::tabComplete(const char *prevText, S32 baseLen, bool fForward)
{
return mNameSpace->tabComplete(prevText, baseLen, fForward);
}
void SimObject::setDataField(StringTableEntry slotName, const char *array, const char *value)
{
// first search the static fields if enabled
if(mFlags.test(ModStaticFields))
{
const AbstractClassRep::Field *fld = findField(slotName);
if(fld)
{
if( fld->type == AbstractClassRep::DepricatedFieldType ||
fld->type == AbstractClassRep::StartGroupFieldType ||
fld->type == AbstractClassRep::EndGroupFieldType) return;
S32 array1 = array ? dAtoi(array) : 0;
if(array1 >= 0 && array1 < fld->elementCount && fld->elementCount >= 1)
Con::setData(fld->type, (void *) (((const char *)this) + fld->offset), array1, 1, &value, fld->table);
if(fld->validator)
fld->validator->validateType(this, (void *) (((const char *)this) + fld->offset));
/*else if(array1 == -1 && fld->elementCount == argc)
{
S32 i;
for(i = 0; i < argc;i++)
Con::setData(fld->type, (void *) (U32(this) + fld->offset), i, 1, argv + i, fld->table);
}*/
onStaticModified(slotName);
return;
}
}
if(mFlags.test(ModDynamicFields))
{
if(!mFieldDictionary)
mFieldDictionary = new SimFieldDictionary;
if(!array)
mFieldDictionary->setFieldValue(slotName, value);
else
{
char buf[256];
dStrcpy(buf, slotName);
dStrcat(buf, array);
mFieldDictionary->setFieldValue(StringTable->insert(buf), value);
}
}
}
const char *SimObject::getDataField(StringTableEntry slotName, const char *array)
{
if(mFlags.test(ModStaticFields))
{
S32 array1 = array ? dAtoi(array) : -1;
const AbstractClassRep::Field *fld = findField(slotName);
if(fld)
{
if(array1 == -1 && fld->elementCount == 1)
return Con::getData(fld->type, (void *) (((const char *)this) + fld->offset), 0, fld->table, fld->flag);
if(array1 >= 0 && array1 < fld->elementCount)
return Con::getData(fld->type, (void *) (((const char *)this) + fld->offset), array1, fld->table, fld->flag);// + typeSizes[fld.type] * array1));
return "";
}
}
if(mFlags.test(ModDynamicFields))
{
if(!mFieldDictionary)
return "";
if(!array)
{
if (const char* val = mFieldDictionary->getFieldValue(slotName))
return val;
}
else
{
static char buf[256];
dStrcpy(buf, slotName);
dStrcat(buf, array);
if (const char* val = mFieldDictionary->getFieldValue(StringTable->insert(buf)))
return val;
}
}
return "";
}
SimObject::~SimObject()
{
delete mFieldDictionary;
AssertFatal(nextNameObject == (SimObject*)-1,avar(
"SimObject::~SimObject: Not removed from dictionary: name %s, id %i",
objectName, mId));
AssertFatal(nextManagerNameObject == (SimObject*)-1,avar(
"SimObject::~SimObject: Not removed from manager dictionary: name %s, id %i",
objectName,mId));
AssertFatal(mFlags.test(Added) == 0, "SimObject::object "
"missing call to SimObject::onRemove");
}
//---------------------------------------------------------------------------
bool SimObject::isLocked()
{
if(!mFieldDictionary)
return false;
const char * val = mFieldDictionary->getFieldValue( StringTable->insert( "locked", false ) );
return( val ? dAtob(val) : false );
}
void SimObject::setLocked( bool b = true )
{
setDataField(StringTable->insert("locked", false), NULL, b ? "true" : "false" );
}
bool SimObject::isHidden()
{
if(!mFieldDictionary)
return false;
const char * val = mFieldDictionary->getFieldValue( StringTable->insert( "hidden", false ) );
return( val ? dAtob(val) : false );
}
void SimObject::setHidden(bool b = true)
{
setDataField(StringTable->insert("hidden", false), NULL, b ? "true" : "false" );
}
const char* SimObject::getIdString()
{
static char IDbuffer[12];
dSprintf(IDbuffer, sizeof(IDbuffer), "%d", mId);
return IDbuffer;
}
//---------------------------------------------------------------------------
bool SimObject::onAdd()
{
mFlags.set(Added);
if(getClassRep())
mNameSpace = getClassRep()->getNameSpace();
// onAdd() should return FALSE if there was an error
return true;
}
void SimObject::onRemove()
{
mFlags.clear(Added);
}
void SimObject::onGroupAdd()
{
}
void SimObject::onGroupRemove()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -