From 928d0b277870618230f370df0016875441e8cb54 Mon Sep 17 00:00:00 2001 From: ZZYZX Date: Thu, 19 Jan 2017 10:56:28 +0200 Subject: [PATCH 1/6] Exposed P_ChangeSector as Sector.ChangeSector --- src/p_map.cpp | 15 +++++++++++++++ wadsrc/static/zscript/mapdata.txt | 11 ++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/p_map.cpp b/src/p_map.cpp index ae3dfd0f2..9ca2d3a8f 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -6358,6 +6358,21 @@ void PIT_CeilingRaise(AActor *thing, FChangePosition *cpos) // //============================================================================= +// +DEFINE_ACTION_FUNCTION(_Sector, ChangeSector) +{ + PARAM_SELF_STRUCT_PROLOGUE(sector_t); + PARAM_INT(crunch); + PARAM_FLOAT(amt); + PARAM_INT(floorOrCeil); + PARAM_BOOL(isreset); + PARAM_BOOL(instant); + + bool b = P_ChangeSector(self, crunch, amt, floorOrCeil, isreset, instant); + + ACTION_RETURN_BOOL(b); +} + bool P_ChangeSector(sector_t *sector, int crunch, double amt, int floorOrCeil, bool isreset, bool instant) { FChangePosition cpos; diff --git a/wadsrc/static/zscript/mapdata.txt b/wadsrc/static/zscript/mapdata.txt index b7589f8d4..15f798460 100644 --- a/wadsrc/static/zscript/mapdata.txt +++ b/wadsrc/static/zscript/mapdata.txt @@ -270,7 +270,7 @@ struct Sector native SECF_NOMODIFY = SECF_SECRET|SECF_WASSECRET, // not modifiable by Sector_ChangeFlags SECF_SPECIALFLAGS = SECF_DAMAGEFLAGS|SECF_FRICTION|SECF_PUSH, // these flags originate from 'special and must be transferrable by floor thinkers } - + enum EMoveResult { MOVE_OK, @@ -289,6 +289,15 @@ struct Sector native native int Index(); + enum EChangeSectorMode + { + CS_Floor = 0, + CS_Ceiling = 1, + CS_3DMidTex = 2 + }; + + native bool ChangeSector(int crunch, double amt, EChangeSectorMode mode/*floorOrCeiling*/, bool isreset, bool instant); + native double, Sector, F3DFloor NextHighestCeilingAt(double x, double y, double bottomz, double topz, int flags = 0); native double, Sector, F3DFloor NextLowestFloorAt(double x, double y, double z, int flags = 0, double steph = 0); From 4815d5a8353b29e08ed9bffa593915daff05bf3c Mon Sep 17 00:00:00 2001 From: ZZYZX Date: Thu, 19 Jan 2017 11:25:06 +0200 Subject: [PATCH 2/6] Made plane normal changes trigger the VBO update as well --- src/gl/data/gl_vertexbuffer.cpp | 26 +++++++++++++++++--------- src/r_defs.h | 1 + 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/gl/data/gl_vertexbuffer.cpp b/src/gl/data/gl_vertexbuffer.cpp index 4973ad39d..957884bb0 100644 --- a/src/gl/data/gl_vertexbuffer.cpp +++ b/src/gl/data/gl_vertexbuffer.cpp @@ -397,7 +397,9 @@ void FFlatVertexBuffer::CreateFlatVBO() { for(auto &sec : level.sectors) { - CreateVertices(h, &sec, sec.GetSecPlane(h), h == sector_t::floor); + secplane_t& plane = sec.GetSecPlane(h); + CreateVertices(h, &sec, plane, h == sector_t::floor); + plane.vbonormal = plane.normal; } } @@ -464,15 +466,21 @@ void FFlatVertexBuffer::CreateVBO() void FFlatVertexBuffer::CheckPlanes(sector_t *sector) { - if (sector->GetPlaneTexZ(sector_t::ceiling) != sector->vboheight[sector_t::ceiling]) + for (int i = sector_t::floor; i <= sector_t::ceiling; i++) { - UpdatePlaneVertices(sector, sector_t::ceiling); - sector->vboheight[sector_t::ceiling] = sector->GetPlaneTexZ(sector_t::ceiling); - } - if (sector->GetPlaneTexZ(sector_t::floor) != sector->vboheight[sector_t::floor]) - { - UpdatePlaneVertices(sector, sector_t::floor); - sector->vboheight[sector_t::floor] = sector->GetPlaneTexZ(sector_t::floor); + if (sector->GetPlaneTexZ(i) != sector->vboheight[i]) + { + UpdatePlaneVertices(sector, i); + sector->vboheight[i] = sector->GetPlaneTexZ(i); + continue; + } + + secplane_t &splane = sector->GetSecPlane(i); + if (splane.normal != splane.vbonormal) + { + UpdatePlaneVertices(sector, i); + splane.vbonormal = splane.normal; + } } } diff --git a/src/r_defs.h b/src/r_defs.h index a6e8358ee..d697805f0 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -300,6 +300,7 @@ struct secplane_t //private: DVector3 normal; double D, negiC; // negative iC because that also saves a negation in all methods using this. + DVector3 vbonormal; // [ZZ] for opengl update. it's critical that this member is the last one, so that {{x,y,z},...} works properly public: friend FSerializer &Serialize(FSerializer &arc, const char *key, secplane_t &p, secplane_t *def); From 6c5119347b83e27ea86470e17bbe3b200a3b3b40 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Fri, 9 Mar 2018 02:06:41 +0100 Subject: [PATCH 3/6] Add PostUiTick(). Happens after all other tickers. Useful for handling changes in the play side within the same tic. --- src/events.cpp | 14 ++++++++++++++ src/events.h | 5 ++++- src/g_game.cpp | 3 +++ wadsrc/static/zscript/events.txt | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/events.cpp b/src/events.cpp index ec8b07af9..c4a3b833b 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -509,6 +509,7 @@ DEFINE_EVENT_LOOPER(RenderFrame) DEFINE_EVENT_LOOPER(WorldLightning) DEFINE_EVENT_LOOPER(WorldTick) DEFINE_EVENT_LOOPER(UiTick) +DEFINE_EVENT_LOOPER(PostUiTick) // declarations IMPLEMENT_CLASS(DStaticEventHandler, false, true); @@ -640,6 +641,7 @@ DEFINE_EMPTY_HANDLER(DStaticEventHandler, PlayerDisconnected) DEFINE_EMPTY_HANDLER(DStaticEventHandler, UiProcess); DEFINE_EMPTY_HANDLER(DStaticEventHandler, InputProcess); DEFINE_EMPTY_HANDLER(DStaticEventHandler, UiTick); +DEFINE_EMPTY_HANDLER(DStaticEventHandler, PostUiTick); DEFINE_EMPTY_HANDLER(DStaticEventHandler, ConsoleProcess); DEFINE_EMPTY_HANDLER(DStaticEventHandler, NetworkProcess); @@ -1021,6 +1023,18 @@ void DStaticEventHandler::UiTick() } } +void DStaticEventHandler::PostUiTick() +{ + IFVIRTUAL(DStaticEventHandler, PostUiTick) + { + // don't create excessive DObjects if not going to be processed anyway + if (func == DStaticEventHandler_PostUiTick_VMPtr) + return; + VMValue params[1] = { (DStaticEventHandler*)this }; + VMCall(func, params, 1, nullptr, 0); + } +} + void DStaticEventHandler::ConsoleProcess(int player, FString name, int arg1, int arg2, int arg3, bool manual) { if (player < 0) diff --git a/src/events.h b/src/events.h index 5ef7f85aa..dff11e7a1 100755 --- a/src/events.h +++ b/src/events.h @@ -46,6 +46,8 @@ void E_WorldLightning(); void E_WorldTick(); // this executes on every tick on UI side, always void E_UiTick(); +// this executes on every tick on UI side, always AND immediately after everything else +void E_PostUiTick(); // called on each render frame once. void E_RenderFrame(); // called after everything's been rendered, but before console/menus @@ -154,6 +156,7 @@ public: bool InputProcess(const event_t* ev); bool UiProcess(const event_t* ev); void UiTick(); + void PostUiTick(); // void ConsoleProcess(int player, FString name, int arg1, int arg2, int arg3, bool manual); @@ -249,4 +252,4 @@ struct FConsoleEvent bool IsManual; }; -#endif \ No newline at end of file +#endif diff --git a/src/g_game.cpp b/src/g_game.cpp index 2ca349631..c2ebd88be 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1256,6 +1256,9 @@ void G_Ticker () default: break; } + + // [MK] Additional ticker for UI events right after all others + E_PostUiTick(); } diff --git a/wadsrc/static/zscript/events.txt b/wadsrc/static/zscript/events.txt index f3a281e0c..885f3d2c9 100755 --- a/wadsrc/static/zscript/events.txt +++ b/wadsrc/static/zscript/events.txt @@ -317,6 +317,7 @@ class StaticEventHandler : Object native play version("2.4") virtual native ui bool UiProcess(UiEvent e); virtual native ui bool InputProcess(InputEvent e); virtual native ui void UiTick(); + virtual native ui void PostUiTick(); // virtual native ui void ConsoleProcess(ConsoleEvent e); From d0cf6c0ab8ab87340377c465294f42780454f9b8 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sat, 17 Mar 2018 16:01:47 +0100 Subject: [PATCH 4/6] Add worldlineactivated event, triggered after successful line activation. --- src/events.cpp | 23 +++++++++++++++++++++++ src/events.h | 7 ++++++- src/p_spec.cpp | 5 +++++ wadsrc/static/zscript/events.txt | 3 +++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/events.cpp b/src/events.cpp index ec8b07af9..51908c1c4 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -413,6 +413,12 @@ void E_WorldThingDestroyed(AActor* actor) handler->WorldThingDestroyed(actor); } +void E_WorldLineActivated(line_t* line, AActor* actor) +{ + for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + handler->WorldLineActivated(line, actor); +} + void E_PlayerEntered(int num, bool fromhub) { // this event can happen during savegamerestore. make sure that local handlers don't receive it. @@ -540,6 +546,7 @@ DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageSource); DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageType); DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageFlags); DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageAngle); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, ActivatedLine); DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, PlayerNumber); DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, IsReturn); @@ -626,6 +633,7 @@ DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDied) DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingRevived) DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDamaged) DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDestroyed) +DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldLineActivated) DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldLightning) DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldTick) @@ -786,6 +794,21 @@ void DStaticEventHandler::WorldThingDestroyed(AActor* actor) } } +void DStaticEventHandler::WorldLineActivated(line_t* line, AActor* actor) +{ + IFVIRTUAL(DStaticEventHandler, WorldLineActivated) + { + // don't create excessive DObjects if not going to be processed anyway + if (func == DStaticEventHandler_WorldLineActivated_VMPtr) + return; + FWorldEvent e = E_SetupWorldEvent(); + e.Thing = actor; + e.ActivatedLine = line; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; + VMCall(func, params, 2, nullptr, 0); + } +} + void DStaticEventHandler::WorldLightning() { IFVIRTUAL(DStaticEventHandler, WorldLightning) diff --git a/src/events.h b/src/events.h index 5ef7f85aa..5142097d0 100755 --- a/src/events.h +++ b/src/events.h @@ -40,6 +40,8 @@ void E_WorldThingRevived(AActor* actor); void E_WorldThingDamaged(AActor* actor, AActor* inflictor, AActor* source, int damage, FName mod, int flags, DAngle angle); // called before AActor::Destroy of each actor. void E_WorldThingDestroyed(AActor* actor); +// called in P_ActivateLine after successful special execution. +void E_WorldLineActivated(line_t* line, AActor* actor); // same as ACS SCRIPT_Lightning void E_WorldLightning(); // this executes on every tick, before everything, only when in valid level and not paused @@ -137,6 +139,7 @@ public: void WorldThingRevived(AActor*); void WorldThingDamaged(AActor*, AActor*, AActor*, int, FName, int, DAngle); void WorldThingDestroyed(AActor*); + void WorldLineActivated(line_t*, AActor*); void WorldLightning(); void WorldTick(); @@ -192,6 +195,8 @@ struct FWorldEvent FName DamageType; int DamageFlags = 0; DAngle DamageAngle; + // for lineactivated + line_t* ActivatedLine = nullptr; }; struct FPlayerEvent @@ -249,4 +254,4 @@ struct FConsoleEvent bool IsManual; }; -#endif \ No newline at end of file +#endif diff --git a/src/p_spec.cpp b/src/p_spec.cpp index d0d972448..36d1bb11c 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -188,8 +188,10 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe { return false; } + bool remote = (line->special != 7 && line->special != 8 && (line->special < 11 || line->special > 14)); if (line->locknumber > 0 && !P_CheckKeys (mo, line->locknumber, remote)) return false; + lineActivation = line->activation; repeat = line->flags & ML_REPEAT_SPECIAL; buttonSuccess = false; @@ -198,6 +200,9 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe line->args[1], line->args[2], line->args[3], line->args[4]); + // [MK] Fire up WorldLineActivated + if ( buttonSuccess ) E_WorldLineActivated(line, mo); + special = line->special; if (!repeat && buttonSuccess) { // clear the special on non-retriggerable lines diff --git a/wadsrc/static/zscript/events.txt b/wadsrc/static/zscript/events.txt index f3a281e0c..5ce95c240 100755 --- a/wadsrc/static/zscript/events.txt +++ b/wadsrc/static/zscript/events.txt @@ -25,6 +25,8 @@ struct WorldEvent native play version("2.4") native readonly Name DamageType; native readonly EDmgFlags DamageFlags; native readonly double DamageAngle; + // for lineactivated + native readonly Line ActivatedLine; } struct PlayerEvent native play version("2.4") @@ -300,6 +302,7 @@ class StaticEventHandler : Object native play version("2.4") virtual native void WorldThingRevived(WorldEvent e); virtual native void WorldThingDamaged(WorldEvent e); virtual native void WorldThingDestroyed(WorldEvent e); + virtual native void WorldLineActivated(WorldEvent e); virtual native void WorldLightning(WorldEvent e); // for the sake of completeness. virtual native void WorldTick(); From b6ddcf0d0623b0d3ed950e8b72f672528d945a53 Mon Sep 17 00:00:00 2001 From: Jason Francis Date: Mon, 19 Mar 2018 10:39:50 -0400 Subject: [PATCH 5/6] Enable string & float user_ properties in UDMF things --- src/p_setup.cpp | 27 ++++++++++++------ src/p_setup.h | 9 ++---- src/p_udmf.cpp | 65 +++++++++++++++++-------------------------- src/scripting/types.h | 1 + 4 files changed, 47 insertions(+), 55 deletions(-) diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 022eba064..5a61b0560 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -167,7 +167,7 @@ bool hasglnodes; TArray MapThingsConverted; TMap MapThingsUserDataIndex; // from mapthing idx -> user data idx -TArray MapThingsUserData; +TArray MapThingsUserData; int sidecount; sidei_t *sidetemp; @@ -1645,23 +1645,34 @@ static void SetMapThingUserData(AActor *actor, unsigned udi) { return; } - while (MapThingsUserData[udi].Property != NAME_None) + while (MapThingsUserData[udi].Key != NAME_None) { - FName varname = MapThingsUserData[udi].Property; - int value = MapThingsUserData[udi].Value; + FName varname = MapThingsUserData[udi].Key; PField *var = dyn_cast(actor->GetClass()->FindSymbol(varname, true)); - udi++; - if (var == NULL || (var->Flags & (VARF_Native|VARF_Private|VARF_Protected|VARF_Static)) || !var->Type->isScalar()) { - DPrintf(DMSG_WARNING, "%s is not a user variable in class %s\n", varname.GetChars(), + DPrintf(DMSG_WARNING, "%s is not a writable user variable in class %s\n", varname.GetChars(), actor->GetClass()->TypeName.GetChars()); } else { // Set the value of the specified user variable. - var->Type->SetValue(reinterpret_cast(actor) + var->Offset, value); + void *addr = reinterpret_cast(actor) + var->Offset; + if (var->Type->isString()) + { + var->Type->InitializeValue(addr, &MapThingsUserData[udi].StringVal); + } + else if (var->Type->isFloat()) + { + var->Type->SetValue(addr, MapThingsUserData[udi].FloatVal); + } + else if (var->Type->isIntCompatible()) + { + var->Type->SetValue(addr, MapThingsUserData[udi].IntVal); + } } + + udi++; } } diff --git a/src/p_setup.h b/src/p_setup.h index cd14f17a2..6b961bfa7 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -30,6 +30,7 @@ #include "resourcefiles/resourcefile.h" #include "doomdata.h" +#include "r_defs.h" struct MapData @@ -180,14 +181,8 @@ struct FMissingCount }; typedef TMap FMissingTextureTracker; -// Record of user data for UDMF maps -struct FMapThingUserData -{ - FName Property; - int Value; -}; extern TMap MapThingsUserDataIndex; // from mapthing idx -> user data idx -extern TArray MapThingsUserData; +extern TArray MapThingsUserData; #endif diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index 53d2ece9b..bb9055486 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -476,38 +476,7 @@ public: fogMap = normMap = NULL; } - void AddUserKey(FName key, int kind, int index) - { - FUDMFKeys &keyarray = UDMFKeys[kind][index]; - - for(unsigned i=0; i < keyarray.Size(); i++) - { - if (keyarray[i].Key == key) - { - switch (sc.TokenType) - { - case TK_IntConst: - keyarray[i] = sc.Number; - break; - case TK_FloatConst: - keyarray[i] = sc.Float; - break; - default: - case TK_StringConst: - keyarray[i] = parsedString; - break; - case TK_True: - keyarray[i] = 1; - break; - case TK_False: - keyarray[i] = 0; - break; - } - return; - } - } - FUDMFKey ukey; - ukey.Key = key; + void ReadUserKey(FUDMFKey &ukey) { switch (sc.TokenType) { case TK_IntConst: @@ -527,6 +496,22 @@ public: ukey = 0; break; } + } + void AddUserKey(FName key, int kind, int index) + { + FUDMFKeys &keyarray = UDMFKeys[kind][index]; + + for(unsigned i=0; i < keyarray.Size(); i++) + { + if (keyarray[i].Key == key) + { + ReadUserKey(keyarray[i]); + return; + } + } + FUDMFKey ukey; + ukey.Key = key; + ReadUserKey(ukey); keyarray.Push(ukey); } @@ -809,10 +794,10 @@ public: CHECK_N(Zd | Zdt) if (0 == strnicmp("user_", key.GetChars(), 5)) { // Custom user key - Sets an actor's user variable directly - FMapThingUserData ud; - ud.Property = key; - ud.Value = CheckInt(key); - MapThingsUserData.Push(ud); + FUDMFKey ukey; + ukey.Key = key; + ReadUserKey(ukey); + MapThingsUserData.Push(ukey); } break; } @@ -2111,10 +2096,10 @@ public: { // User data added MapThingsUserDataIndex[MapThingsConverted.Size()-1] = userdatastart; // Mark end of the user data for this map thing - FMapThingUserData ud; - ud.Property = NAME_None; - ud.Value = 0; - MapThingsUserData.Push(ud); + FUDMFKey ukey; + ukey.Key = NAME_None; + ukey = 0; + MapThingsUserData.Push(ukey); } } else if (sc.Compare("linedef")) diff --git a/src/scripting/types.h b/src/scripting/types.h index 5c55db6c1..dbfca2039 100644 --- a/src/scripting/types.h +++ b/src/scripting/types.h @@ -200,6 +200,7 @@ public: bool isStruct() const { return TypeTableType == NAME_Struct; } bool isClass() const { return TypeTableType == NAME_Object; } bool isPrototype() const { return TypeTableType == NAME_Prototype; } + bool isString() const { return TypeTableType == NAME_String; } PContainerType *toContainer() { return isContainer() ? (PContainerType*)this : nullptr; } PPointer *toPointer() { return isPointer() ? (PPointer*)this : nullptr; } From d79ca503a2f1d2f6500b7d21bfefaef9650565cd Mon Sep 17 00:00:00 2001 From: Jason Francis Date: Mon, 19 Mar 2018 12:43:26 -0400 Subject: [PATCH 6/6] Allow setting string user variables in ACS --- src/p_acs.cpp | 17 +++++++++++------ src/p_setup.cpp | 4 ++-- src/scripting/types.h | 1 - 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 1b6c472d8..6f1d1635d 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -5065,10 +5065,10 @@ bool GetVarAddrType(AActor *self, FName varname, int index, void *&addr, PType * } addr = baddr; // We don't want Int subclasses like Name or Color to be accessible here. - if (!type->isInt() && !type->isFloat() && type != TypeBool) + if (!type->isInt() && !type->isFloat() && type != TypeBool && type != TypeString) { - // For reading, we also support Name and String types. - if (readonly && (type == TypeName || type == TypeString)) + // For reading, we also support Name types. + if (readonly && (type == TypeName)) { return true; } @@ -5084,13 +5084,18 @@ static void SetUserVariable(AActor *self, FName varname, int index, int value) if (GetVarAddrType(self, varname, index, addr, type, false)) { - if (!type->isFloat()) + if (type == TypeString) { - type->SetValue(addr, value); + FString str = FBehavior::StaticLookupString(value); + type->InitializeValue(addr, &str); + } + else if (type->isFloat()) + { + type->SetValue(addr, ACSToDouble(value)); } else { - type->SetValue(addr, ACSToDouble(value)); + type->SetValue(addr, value); } } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 5a61b0560..dbc3d31d2 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -1658,7 +1658,7 @@ static void SetMapThingUserData(AActor *actor, unsigned udi) else { // Set the value of the specified user variable. void *addr = reinterpret_cast(actor) + var->Offset; - if (var->Type->isString()) + if (var->Type == TypeString) { var->Type->InitializeValue(addr, &MapThingsUserData[udi].StringVal); } @@ -1666,7 +1666,7 @@ static void SetMapThingUserData(AActor *actor, unsigned udi) { var->Type->SetValue(addr, MapThingsUserData[udi].FloatVal); } - else if (var->Type->isIntCompatible()) + else if (var->Type->isInt() || var->Type == TypeBool) { var->Type->SetValue(addr, MapThingsUserData[udi].IntVal); } diff --git a/src/scripting/types.h b/src/scripting/types.h index dbfca2039..5c55db6c1 100644 --- a/src/scripting/types.h +++ b/src/scripting/types.h @@ -200,7 +200,6 @@ public: bool isStruct() const { return TypeTableType == NAME_Struct; } bool isClass() const { return TypeTableType == NAME_Object; } bool isPrototype() const { return TypeTableType == NAME_Prototype; } - bool isString() const { return TypeTableType == NAME_String; } PContainerType *toContainer() { return isContainer() ? (PContainerType*)this : nullptr; } PPointer *toPointer() { return isPointer() ? (PPointer*)this : nullptr; }