From 34345a7eeb80e0b164b259321b2d8b73af87295d Mon Sep 17 00:00:00 2001 From: Redo Date: Fri, 3 Oct 2025 17:47:26 -0500 Subject: [PATCH 1/4] wip allow inheriting object method types --- BlockLua-Unsafe.dll | Bin 369198 -> 0 bytes BlockLua.dll | Bin 369198 -> 369710 bytes compile.bat | 11 +++++++---- lua5.1.dll | Bin 478566 -> 479364 bytes readme.md | 9 ++++++++- src/util/libbl.lua | 36 ++++++++++++++++++++++++++++-------- 6 files changed, 43 insertions(+), 13 deletions(-) delete mode 100644 BlockLua-Unsafe.dll diff --git a/BlockLua-Unsafe.dll b/BlockLua-Unsafe.dll deleted file mode 100644 index e6c29ca1e83ce2b6405a36f9ec536d020a4c125b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369198 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 BlockLua.dll.dump.txt +@rem objdump -d BlockLua-Unsafe.dll > BlockLua-Unsafe.dll.dump.txt + @echo off -rem objdump -d BlockLua.dll > BlockLua.dll.dump.txt -rem objdump -d BlockLua-Unsafe.dll > BlockLua-Unsafe.dll.dump.txt - pause diff --git a/lua5.1.dll b/lua5.1.dll index 752c9c1df84d75634dad4b146eedcf777bcb7e91..8f09561330c19e7f95c9487915e1ceef6e72856e 100644 GIT binary patch delta 9122 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 delta 7678 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 d9Y}w9LX}9=_m6h$)RU^uRL-* Date: Fri, 3 Oct 2025 19:32:54 -0500 Subject: [PATCH 2/4] bug and warning fixes from auios --- BlockLua.dll | Bin 369710 -> 369710 bytes lualib/ltn12.lua | 2 +- lualib/socket/url.lua | 4 ++-- src/util/libbl.lua | 10 +++++----- src/util/libts.lua | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/BlockLua.dll b/BlockLua.dll index d2650e1555e109641884133af887c30a6b129e2d..e30628e265cf2b30947f77ba4d21ab0a808aa7ee 100644 GIT binary patch delta 6602 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 Date: Sat, 4 Oct 2025 00:49:19 -0500 Subject: [PATCH 3/4] rework hooks, proper arg conversion for luacall from ts, fix+rename bl.addServerCmd/addClientCmd, remove 'bool' from ts.type (only use 'boolean'), more dedefault typedefs, support typedefs on named objects, typedef inheritance, reorganize libts --- BlockLua.dll | Bin 369710 -> 374823 bytes readme.md | 30 +- src/bllua4.cpp | 6 +- src/ts-env.cs | 26 - src/util/libbl-support.cs | 5 +- src/util/libbl-types.lua | 1545 ++++++++++---------- src/util/libbl.lua | 269 ++-- src/util/{libts.lua => libts-lua.lua} | 6 +- src/util/{libts-support.cs => libts-ts.cs} | 24 +- 9 files changed, 1005 insertions(+), 906 deletions(-) rename src/util/{libts.lua => libts-lua.lua} (97%) rename src/util/{libts-support.cs => libts-ts.cs} (72%) diff --git a/BlockLua.dll b/BlockLua.dll index e30628e265cf2b30947f77ba4d21ab0a808aa7ee..68f65ae06770b81e774aaa1e409fe2ce6a992c66 100644 GIT binary patch delta 36326 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 NaCh6rjfQ92{~v!F#`FLH delta 30605 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 " @ %text); - luacall("_bllua_smarteval", %text); + _bllua_luacall("_bllua_smarteval", %text); } else { echo("Lua: not loaded"); } @@ -36,7 +36,8 @@ package _bllua_objectDeletionHook { // note: no parent function exists by default, // and this is loaded before any addons //parent::onRemove(%obj); - if($_bllua_active) luacall("_bllua_objectDeleted", %obj); + // assuming obj is an ID and never a name + if($_bllua_active) _bllua_luacall("_bllua_objectDeleted", %obj); } }; activatePackage(_bllua_objectDeletionHook); diff --git a/src/util/libbl-types.lua b/src/util/libbl-types.lua index 28502e1..26deec1 100644 --- a/src/util/libbl-types.lua +++ b/src/util/libbl-types.lua @@ -1167,7 +1167,7 @@ bl.type('spamAlert', 'boolean') -- Auto-generated from dumpConsoleClasses() and dumpConsoleFunctions() bl.type('AIConnection::onConnect:1', 'object') -bl.type('AIPlayer.canSetIFLs', 'bool') +bl.type('AIPlayer.canSetIFLs', 'boolean') bl.type('AIPlayer::InstantRespawn:1', 'object') bl.type('AIPlayer::clearAim:1', 'object') bl.type('AIPlayer::clearMoveDestination:1', 'object') @@ -1184,30 +1184,30 @@ bl.type('AIPlayer::getMoveObject:1', 'object') bl.type('AIPlayer::getMoveTolerance:1', 'object') bl.type('AIPlayer::getPlayerName:1', 'object') bl.type('AIPlayer::hMeleeAttack:1', 'object') -bl.type('AIPlayer::isCrouching', 'bool') +bl.type('AIPlayer::isCrouching', 'boolean') bl.type('AIPlayer::isCrouching:1', 'object') -bl.type('AIPlayer::isJetting', 'bool') +bl.type('AIPlayer::isJetting', 'boolean') bl.type('AIPlayer::isJetting:1', 'object') -bl.type('AIPlayer::isJumping', 'bool') +bl.type('AIPlayer::isJumping', 'boolean') bl.type('AIPlayer::isJumping:1', 'object') bl.type('AIPlayer::setAimLocation:1', 'object') bl.type('AIPlayer::setAimObject:1', 'object') bl.type('AIPlayer::setAimObject:2', 'object') bl.type('AIPlayer::setAimVector:1', 'object') bl.type('AIPlayer::setCrouching:1', 'object') -bl.type('AIPlayer::setCrouching:2', 'bool') +bl.type('AIPlayer::setCrouching:2', 'boolean') bl.type('AIPlayer::setEngageDistance:1', 'object') bl.type('AIPlayer::setHeadAngle:1', 'object') bl.type('AIPlayer::setHeadAngleSpeed:1', 'object') bl.type('AIPlayer::setJetting:1', 'object') -bl.type('AIPlayer::setJetting:2', 'bool') +bl.type('AIPlayer::setJetting:2', 'boolean') bl.type('AIPlayer::setJumping:1', 'object') -bl.type('AIPlayer::setJumping:2', 'bool') +bl.type('AIPlayer::setJumping:2', 'boolean') bl.type('AIPlayer::setMoveDestination:1', 'object') bl.type('AIPlayer::setMoveObject:1', 'object') bl.type('AIPlayer::setMoveObject:2', 'object') bl.type('AIPlayer::setMoveSlowdown:1', 'object') -bl.type('AIPlayer::setMoveSlowdown:2', 'bool') +bl.type('AIPlayer::setMoveSlowdown:2', 'boolean') bl.type('AIPlayer::setMoveSpeed:1', 'object') bl.type('AIPlayer::setMoveTolerance:1', 'object') bl.type('AIPlayer::setMoveX:1', 'object') @@ -1223,7 +1223,7 @@ bl.type('ActionMap::getCommand:1', 'object') bl.type('ActionMap::getDeadZone:1', 'object') bl.type('ActionMap::getNumBinds:1', 'object') bl.type('ActionMap::getScale:1', 'object') -bl.type('ActionMap::isInverted', 'bool') +bl.type('ActionMap::isInverted', 'boolean') bl.type('ActionMap::isInverted:1', 'object') bl.type('ActionMap::pop:1', 'object') bl.type('ActionMap::popUnbind:1', 'object') @@ -1243,20 +1243,20 @@ bl.type('AkimboGunImage::onMount:1', 'object') bl.type('AkimboGunImage::onUnMount:1', 'object') bl.type('AllPrintRatios_List::onSelect:1', 'object') bl.type('Armor::onCollision:1', 'object') -bl.type('AudioDescription.is3D', 'bool') -bl.type('AudioDescription.isLooping', 'bool') -bl.type('AudioDescription.isStreaming', 'bool') -bl.type('AudioEmitter.enableVisualFeedback', 'bool') -bl.type('AudioEmitter.is3D', 'bool') -bl.type('AudioEmitter.isLooping', 'bool') -bl.type('AudioEmitter.outsideAmbient', 'bool') -bl.type('AudioEmitter.useProfileDescription', 'bool') +bl.type('AudioDescription.is3D', 'boolean') +bl.type('AudioDescription.isLooping', 'boolean') +bl.type('AudioDescription.isStreaming', 'boolean') +bl.type('AudioEmitter.enableVisualFeedback', 'boolean') +bl.type('AudioEmitter.is3D', 'boolean') +bl.type('AudioEmitter.isLooping', 'boolean') +bl.type('AudioEmitter.outsideAmbient', 'boolean') +bl.type('AudioEmitter.useProfileDescription', 'boolean') bl.type('AudioEmitter::getProfileId:1', 'object') bl.type('AudioEmitter::update:1', 'object') -bl.type('AudioEnvironment.useRoom', 'bool') -bl.type('AudioProfile.preload', 'bool') +bl.type('AudioEnvironment.useRoom', 'boolean') +bl.type('AudioProfile.preload', 'boolean') bl.type('AudioProfile::getDescription:1', 'object') -bl.type('AudioProfile::isStereo', 'bool') +bl.type('AudioProfile::isStereo', 'boolean') bl.type('AudioProfile::isStereo:1', 'object') bl.type('AvatarGui::onWake:1', 'object') bl.type('BSD_TabBoxShifter::checkButtonVisibility:1', 'object') @@ -1267,7 +1267,7 @@ bl.type('BSD_category::onRemove:1', 'object') bl.type('BanList::add:1', 'object') bl.type('BanList::addAbsolute:1', 'object') bl.type('BanList::export:1', 'object') -bl.type('BanList::isBanned', 'bool') +bl.type('BanList::isBanned', 'boolean') bl.type('BanList::isBanned:1', 'object') bl.type('BanList::removeBan:1', 'object') bl.type('BanManagerSO::RemoveBanBL_ID:1', 'object') @@ -1306,8 +1306,8 @@ bl.type('BuildMacroSO::pushEvent:1', 'object') bl.type('CSVReader::hasNextValue:1', 'object') bl.type('CSVReader::readNextValue:1', 'object') bl.type('CSVReader::setDataString:1', 'object') -bl.type('Camera.canSetIFLs', 'bool') -bl.type('Camera::getCameraRelativeMovement', 'bool') +bl.type('Camera.canSetIFLs', 'boolean') +bl.type('Camera::getCameraRelativeMovement', 'boolean') bl.type('Camera::getCameraRelativeMovement:1', 'object') bl.type('Camera::getControlObject', 'object') bl.type('Camera::getControlObject:1', 'object') @@ -1316,13 +1316,13 @@ bl.type('Camera::getOrbitObject', 'object') bl.type('Camera::getOrbitObject:1', 'object') bl.type('Camera::getOrbitPoint:1', 'object') bl.type('Camera::getPosition:1', 'object') -bl.type('Camera::isOrbitMode', 'bool') +bl.type('Camera::isOrbitMode', 'boolean') bl.type('Camera::isOrbitMode:1', 'object') bl.type('Camera::onAdd:1', 'object') bl.type('Camera::setCameraRelativeMovement:1', 'object') -bl.type('Camera::setCameraRelativeMovement:2', 'bool') +bl.type('Camera::setCameraRelativeMovement:2', 'boolean') bl.type('Camera::setClampMode:1', 'object') -bl.type('Camera::setControlObject', 'bool') +bl.type('Camera::setControlObject', 'boolean') bl.type('Camera::setControlObject:1', 'object') bl.type('Camera::setControlObject:2', 'object') bl.type('Camera::setDollyMode:1', 'object') @@ -1330,16 +1330,16 @@ bl.type('Camera::setFlyMode:1', 'object') bl.type('Camera::setMode:1', 'object') bl.type('Camera::setOrbitMode:1', 'object') bl.type('Camera::setOrbitMode:2', 'object') -bl.type('Camera::setOrbitMode:7', 'bool') +bl.type('Camera::setOrbitMode:7', 'boolean') bl.type('Camera::setOrbitPointMode:1', 'object') -bl.type('CameraData.emap', 'bool') -bl.type('CameraData.firstPersonOnly', 'bool') -bl.type('CameraData.inheritEnergyFromMount', 'bool') -bl.type('CameraData.isInvincible', 'bool') -bl.type('CameraData.observeThroughObject', 'bool') -bl.type('CameraData.renderWhenDestroyed', 'bool') -bl.type('CameraData.thirdPersonOnly', 'bool') -bl.type('CameraData.useEyePoint', 'bool') +bl.type('CameraData.emap', 'boolean') +bl.type('CameraData.firstPersonOnly', 'boolean') +bl.type('CameraData.inheritEnergyFromMount', 'boolean') +bl.type('CameraData.isInvincible', 'boolean') +bl.type('CameraData.observeThroughObject', 'boolean') +bl.type('CameraData.renderWhenDestroyed', 'boolean') +bl.type('CameraData.thirdPersonOnly', 'boolean') +bl.type('CameraData.useEyePoint', 'boolean') bl.type('CannonFuseImage::onDone:1', 'object') bl.type('CannonSmokeImage::onDone:1', 'object') bl.type('CannonTurret::onDisabled:1', 'object') @@ -1359,9 +1359,9 @@ bl.type('ColorSetGui::selectColor:1', 'object') bl.type('ColorSetGui::setMode:1', 'object') bl.type('ColorSetGui::update:1', 'object') bl.type('ConsoleEntry::eval:1', 'object') -bl.type('ConsoleLogger::attach', 'bool') +bl.type('ConsoleLogger::attach', 'boolean') bl.type('ConsoleLogger::attach:1', 'object') -bl.type('ConsoleLogger::detach', 'bool') +bl.type('ConsoleLogger::detach', 'boolean') bl.type('ConsoleLogger::detach:1', 'object') bl.type('CreateMiniGameGui::ClickCreate:1', 'object') bl.type('CreateMiniGameGui::ClickFav:1', 'object') @@ -1376,19 +1376,19 @@ bl.type('CreateMiniGameGui::end:1', 'object') bl.type('CreateMiniGameGui::onSleep:1', 'object') bl.type('CreateMiniGameGui::onWake:1', 'object') bl.type('CreateMiniGameGui::send:1', 'object') -bl.type('CreatorTree.clipToParent', 'bool') -bl.type('CreatorTree.enabled', 'bool') -bl.type('CreatorTree.visible', 'bool') +bl.type('CreatorTree.clipToParent', 'boolean') +bl.type('CreatorTree.enabled', 'boolean') +bl.type('CreatorTree.visible', 'boolean') bl.type('CreatorTree::addGroup:1', 'object') bl.type('CreatorTree::addItem:1', 'object') bl.type('CreatorTree::clear:1', 'object') -bl.type('CreatorTree::fileNameMatch', 'bool') +bl.type('CreatorTree::fileNameMatch', 'boolean') bl.type('CreatorTree::fileNameMatch:1', 'object') bl.type('CreatorTree::getName:1', 'object') bl.type('CreatorTree::getParent:1', 'object') bl.type('CreatorTree::getSelected:1', 'object') bl.type('CreatorTree::getValue:1', 'object') -bl.type('CreatorTree::isGroup', 'bool') +bl.type('CreatorTree::isGroup', 'boolean') bl.type('CreatorTree::isGroup:1', 'object') bl.type('CustomGameGui::AddAdvancedGuiElement:1', 'object') bl.type('CustomGameGui::ClickBack:1', 'object') @@ -1437,33 +1437,33 @@ bl.type('DDS_PopUpMenuCtrl::stopMove:1', 'object') bl.type('DDS_PopUpMenuCtrl::updateFilter:1', 'object') bl.type('DDS_PopUpMenuCtrl::updateScrollRect:1', 'object') bl.type('DDS_PopUpMenuCtrl::updateTabHint:1', 'object') -bl.type('DNetSetLogging:1', 'bool') -bl.type('DbgFileView.clipToParent', 'bool') -bl.type('DbgFileView.enabled', 'bool') -bl.type('DbgFileView.visible', 'bool') +bl.type('DNetSetLogging:1', 'boolean') +bl.type('DbgFileView.clipToParent', 'boolean') +bl.type('DbgFileView.enabled', 'boolean') +bl.type('DbgFileView.visible', 'boolean') bl.type('DbgFileView::clearBreakPositions:1', 'object') -bl.type('DbgFileView::findString', 'bool') +bl.type('DbgFileView::findString', 'boolean') bl.type('DbgFileView::findString:1', 'object') bl.type('DbgFileView::getCurrentLine:1', 'object') -bl.type('DbgFileView::open', 'bool') +bl.type('DbgFileView::open', 'boolean') bl.type('DbgFileView::open:1', 'object') bl.type('DbgFileView::removeBreak:1', 'object') bl.type('DbgFileView::setBreak:1', 'object') bl.type('DbgFileView::setBreakPosition:1', 'object') bl.type('DbgFileView::setCurrentLine:1', 'object') -bl.type('DbgFileView::setCurrentLine:3', 'bool') -bl.type('Debris::init', 'bool') +bl.type('DbgFileView::setCurrentLine:3', 'boolean') +bl.type('Debris::init', 'boolean') bl.type('Debris::init:1', 'object') -bl.type('DebrisData.explodeOnMaxBounce', 'bool') -bl.type('DebrisData.fade', 'bool') -bl.type('DebrisData.ignoreWater', 'bool') -bl.type('DebrisData.render2D', 'bool') -bl.type('DebrisData.snapOnMaxBounce', 'bool') -bl.type('DebrisData.staticOnMaxBounce', 'bool') -bl.type('DebrisData.useRadiusMass', 'bool') -bl.type('DebugView.clipToParent', 'bool') -bl.type('DebugView.enabled', 'bool') -bl.type('DebugView.visible', 'bool') +bl.type('DebrisData.explodeOnMaxBounce', 'boolean') +bl.type('DebrisData.fade', 'boolean') +bl.type('DebrisData.ignoreWater', 'boolean') +bl.type('DebrisData.render2D', 'boolean') +bl.type('DebrisData.snapOnMaxBounce', 'boolean') +bl.type('DebrisData.staticOnMaxBounce', 'boolean') +bl.type('DebrisData.useRadiusMass', 'boolean') +bl.type('DebugView.clipToParent', 'boolean') +bl.type('DebugView.enabled', 'boolean') +bl.type('DebugView.visible', 'boolean') bl.type('DebugView::addLine:1', 'object') bl.type('DebugView::clearLines:1', 'object') bl.type('DebugView::clearText:1', 'object') @@ -1473,15 +1473,15 @@ bl.type('EGplus_Main::close:1', 'object') bl.type('EGplus_Main::open:1', 'object') bl.type('EGplus_Ticker::clear:1', 'object') bl.type('EGplus_Ticker::showStatus:1', 'object') -bl.type('EditManager.clipToParent', 'bool') -bl.type('EditManager.enabled', 'bool') -bl.type('EditManager.visible', 'bool') +bl.type('EditManager.clipToParent', 'boolean') +bl.type('EditManager.enabled', 'boolean') +bl.type('EditManager.visible', 'boolean') bl.type('EditManager::gotoBookmark:1', 'object') bl.type('EditManager::setBookmark:1', 'object') -bl.type('EditTSCtrl.clipToParent', 'bool') -bl.type('EditTSCtrl.enabled', 'bool') -bl.type('EditTSCtrl.renderMissionArea', 'bool') -bl.type('EditTSCtrl.visible', 'bool') +bl.type('EditTSCtrl.clipToParent', 'boolean') +bl.type('EditTSCtrl.enabled', 'boolean') +bl.type('EditTSCtrl.renderMissionArea', 'boolean') +bl.type('EditTSCtrl.visible', 'boolean') bl.type('EditTSCtrl::renderCircle:1', 'object') bl.type('EditTSCtrl::renderLine:1', 'object') bl.type('EditTSCtrl::renderSphere:1', 'object') @@ -1509,48 +1509,48 @@ bl.type('EnvGuiServer::getIdxFromFilenames:1', 'object') bl.type('EnvGuiServer::readAdvancedVarsFromSimple:1', 'object') bl.type('EnvGui_Window::onWindowFocus:1', 'object') bl.type('Explosion::onAdd:1', 'object') -bl.type('ExplosionData.cameraShakeFalloff', 'bool') -bl.type('ExplosionData.faceViewer', 'bool') -bl.type('ExplosionData.shakeCamera', 'bool') +bl.type('ExplosionData.cameraShakeFalloff', 'boolean') +bl.type('ExplosionData.faceViewer', 'boolean') +bl.type('ExplosionData.shakeCamera', 'boolean') bl.type('ExplosionData::onAdd:1', 'object') bl.type('FileObject::close:1', 'object') -bl.type('FileObject::isEOF', 'bool') +bl.type('FileObject::isEOF', 'boolean') bl.type('FileObject::isEOF:1', 'object') -bl.type('FileObject::openForAppend', 'bool') +bl.type('FileObject::openForAppend', 'boolean') bl.type('FileObject::openForAppend:1', 'object') -bl.type('FileObject::openForRead', 'bool') +bl.type('FileObject::openForRead', 'boolean') bl.type('FileObject::openForRead:1', 'object') -bl.type('FileObject::openForWrite', 'bool') +bl.type('FileObject::openForWrite', 'boolean') bl.type('FileObject::openForWrite:1', 'object') bl.type('FileObject::readLine:1', 'object') bl.type('FileObject::writeLine:1', 'object') -bl.type('FlyingVehicle.canSetIFLs', 'bool') -bl.type('FlyingVehicle.disableMove', 'bool') +bl.type('FlyingVehicle.canSetIFLs', 'boolean') +bl.type('FlyingVehicle.disableMove', 'boolean') bl.type('FlyingVehicle::useCreateHeight:1', 'object') -bl.type('FlyingVehicle::useCreateHeight:2', 'bool') -bl.type('FlyingVehicleData.cameraRoll', 'bool') -bl.type('FlyingVehicleData.emap', 'bool') -bl.type('FlyingVehicleData.firstPersonOnly', 'bool') -bl.type('FlyingVehicleData.inheritEnergyFromMount', 'bool') -bl.type('FlyingVehicleData.isInvincible', 'bool') -bl.type('FlyingVehicleData.observeThroughObject', 'bool') -bl.type('FlyingVehicleData.renderWhenDestroyed', 'bool') -bl.type('FlyingVehicleData.rideAble', 'bool') -bl.type('FlyingVehicleData.thirdPersonOnly', 'bool') -bl.type('FlyingVehicleData.useEyePoint', 'bool') +bl.type('FlyingVehicle::useCreateHeight:2', 'boolean') +bl.type('FlyingVehicleData.cameraRoll', 'boolean') +bl.type('FlyingVehicleData.emap', 'boolean') +bl.type('FlyingVehicleData.firstPersonOnly', 'boolean') +bl.type('FlyingVehicleData.inheritEnergyFromMount', 'boolean') +bl.type('FlyingVehicleData.isInvincible', 'boolean') +bl.type('FlyingVehicleData.observeThroughObject', 'boolean') +bl.type('FlyingVehicleData.renderWhenDestroyed', 'boolean') +bl.type('FlyingVehicleData.rideAble', 'boolean') +bl.type('FlyingVehicleData.thirdPersonOnly', 'boolean') +bl.type('FlyingVehicleData.useEyePoint', 'boolean') bl.type('FlyingVehicleData::Damage:1', 'object') bl.type('FlyingVehicleData::onCollision:1', 'object') bl.type('FootballItem::onBallCollision:1', 'object') -bl.type('GLEW_ARB_shader_objects', 'bool') -bl.type('GLEW_ARB_shading_language_100', 'bool') -bl.type('GLEW_ARB_shadow', 'bool') -bl.type('GLEW_ARB_texture_rg', 'bool') -bl.type('GLEW_EXT_framebuffer_object', 'bool') -bl.type('GLEW_EXT_texture3D', 'bool') -bl.type('GLEW_EXT_texture_array', 'bool') +bl.type('GLEW_ARB_shader_objects', 'boolean') +bl.type('GLEW_ARB_shading_language_100', 'boolean') +bl.type('GLEW_ARB_shadow', 'boolean') +bl.type('GLEW_ARB_texture_rg', 'boolean') +bl.type('GLEW_EXT_framebuffer_object', 'boolean') +bl.type('GLEW_EXT_texture3D', 'boolean') +bl.type('GLEW_EXT_texture_array', 'boolean') bl.type('GameBase::getDataBlock:1', 'object') bl.type('GameBase::inspectPostApply:1', 'object') -bl.type('GameBase::setDataBlock', 'bool') +bl.type('GameBase::setDataBlock', 'boolean') bl.type('GameBase::setDataBlock:1', 'object') bl.type('GameConnection::onDrop:1', 'object') bl.type('GameConnection::setConnectArgs:1', 'object') @@ -1559,77 +1559,77 @@ bl.type('GameModeGui::ClickGameMode:1', 'object') bl.type('GameModeGuiServer::GetMissingAddOns:1', 'object') bl.type('GameModeGuiServer::ParseGameModeFile:1', 'object') bl.type('GameModeGuiServer::PopulateGameModeList:1', 'object') -bl.type('GameTSCtrl.clipToParent', 'bool') -bl.type('GameTSCtrl.enabled', 'bool') -bl.type('GameTSCtrl.visible', 'bool') -bl.type('GameWindowExists', 'bool') -bl.type('GuiAnimatedBitmapCtrl.alignLeft', 'bool') -bl.type('GuiAnimatedBitmapCtrl.alignTop', 'bool') -bl.type('GuiAnimatedBitmapCtrl.clipToParent', 'bool') -bl.type('GuiAnimatedBitmapCtrl.enabled', 'bool') -bl.type('GuiAnimatedBitmapCtrl.keepCached', 'bool') -bl.type('GuiAnimatedBitmapCtrl.lockAspectRatio', 'bool') -bl.type('GuiAnimatedBitmapCtrl.mMultiply', 'bool') -bl.type('GuiAnimatedBitmapCtrl.overflowImage', 'bool') -bl.type('GuiAnimatedBitmapCtrl.skipFrames', 'bool') -bl.type('GuiAnimatedBitmapCtrl.visible', 'bool') -bl.type('GuiAnimatedBitmapCtrl.wrap', 'bool') +bl.type('GameTSCtrl.clipToParent', 'boolean') +bl.type('GameTSCtrl.enabled', 'boolean') +bl.type('GameTSCtrl.visible', 'boolean') +bl.type('GameWindowExists', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.alignLeft', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.alignTop', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.clipToParent', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.enabled', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.keepCached', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.lockAspectRatio', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.mMultiply', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.overflowImage', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.skipFrames', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.visible', 'boolean') +bl.type('GuiAnimatedBitmapCtrl.wrap', 'boolean') bl.type('GuiAnimatedBitmapCtrl::setBitmap:1', 'object') -bl.type('GuiArrayCtrl.clipToParent', 'bool') -bl.type('GuiArrayCtrl.enabled', 'bool') -bl.type('GuiArrayCtrl.visible', 'bool') -bl.type('GuiBackgroundCtrl.clipToParent', 'bool') -bl.type('GuiBackgroundCtrl.enabled', 'bool') -bl.type('GuiBackgroundCtrl.visible', 'bool') -bl.type('GuiBitmapBorderCtrl.clipToParent', 'bool') -bl.type('GuiBitmapBorderCtrl.enabled', 'bool') -bl.type('GuiBitmapBorderCtrl.visible', 'bool') -bl.type('GuiBitmapButtonCtrl.alignLeft', 'bool') -bl.type('GuiBitmapButtonCtrl.alignTop', 'bool') -bl.type('GuiBitmapButtonCtrl.clipToParent', 'bool') -bl.type('GuiBitmapButtonCtrl.enabled', 'bool') -bl.type('GuiBitmapButtonCtrl.lockAspectRatio', 'bool') -bl.type('GuiBitmapButtonCtrl.mKeepCached', 'bool') -bl.type('GuiBitmapButtonCtrl.overflowImage', 'bool') -bl.type('GuiBitmapButtonCtrl.visible', 'bool') +bl.type('GuiArrayCtrl.clipToParent', 'boolean') +bl.type('GuiArrayCtrl.enabled', 'boolean') +bl.type('GuiArrayCtrl.visible', 'boolean') +bl.type('GuiBackgroundCtrl.clipToParent', 'boolean') +bl.type('GuiBackgroundCtrl.enabled', 'boolean') +bl.type('GuiBackgroundCtrl.visible', 'boolean') +bl.type('GuiBitmapBorderCtrl.clipToParent', 'boolean') +bl.type('GuiBitmapBorderCtrl.enabled', 'boolean') +bl.type('GuiBitmapBorderCtrl.visible', 'boolean') +bl.type('GuiBitmapButtonCtrl.alignLeft', 'boolean') +bl.type('GuiBitmapButtonCtrl.alignTop', 'boolean') +bl.type('GuiBitmapButtonCtrl.clipToParent', 'boolean') +bl.type('GuiBitmapButtonCtrl.enabled', 'boolean') +bl.type('GuiBitmapButtonCtrl.lockAspectRatio', 'boolean') +bl.type('GuiBitmapButtonCtrl.mKeepCached', 'boolean') +bl.type('GuiBitmapButtonCtrl.overflowImage', 'boolean') +bl.type('GuiBitmapButtonCtrl.visible', 'boolean') bl.type('GuiBitmapButtonCtrl::getColor:1', 'object') bl.type('GuiBitmapButtonCtrl::setBitmap:1', 'object') bl.type('GuiBitmapButtonCtrl::setColor:1', 'object') -bl.type('GuiBitmapCtrl.alignLeft', 'bool') -bl.type('GuiBitmapCtrl.alignTop', 'bool') -bl.type('GuiBitmapCtrl.clipToParent', 'bool') -bl.type('GuiBitmapCtrl.enabled', 'bool') -bl.type('GuiBitmapCtrl.keepCached', 'bool') -bl.type('GuiBitmapCtrl.lockAspectRatio', 'bool') -bl.type('GuiBitmapCtrl.mMultiply', 'bool') -bl.type('GuiBitmapCtrl.overflowImage', 'bool') -bl.type('GuiBitmapCtrl.visible', 'bool') -bl.type('GuiBitmapCtrl.wrap', 'bool') +bl.type('GuiBitmapCtrl.alignLeft', 'boolean') +bl.type('GuiBitmapCtrl.alignTop', 'boolean') +bl.type('GuiBitmapCtrl.clipToParent', 'boolean') +bl.type('GuiBitmapCtrl.enabled', 'boolean') +bl.type('GuiBitmapCtrl.keepCached', 'boolean') +bl.type('GuiBitmapCtrl.lockAspectRatio', 'boolean') +bl.type('GuiBitmapCtrl.mMultiply', 'boolean') +bl.type('GuiBitmapCtrl.overflowImage', 'boolean') +bl.type('GuiBitmapCtrl.visible', 'boolean') +bl.type('GuiBitmapCtrl.wrap', 'boolean') bl.type('GuiBitmapCtrl::getColor:1', 'object') bl.type('GuiBitmapCtrl::getPixelColor:1', 'object') bl.type('GuiBitmapCtrl::setBitmap:1', 'object') bl.type('GuiBitmapCtrl::setColor:1', 'object') bl.type('GuiBitmapCtrl::setValue:1', 'object') -bl.type('GuiBorderButtonCtrl.clipToParent', 'bool') -bl.type('GuiBorderButtonCtrl.enabled', 'bool') -bl.type('GuiBorderButtonCtrl.visible', 'bool') -bl.type('GuiBubbleTextCtrl.clipToParent', 'bool') -bl.type('GuiBubbleTextCtrl.enabled', 'bool') -bl.type('GuiBubbleTextCtrl.visible', 'bool') -bl.type('GuiButtonBaseCtrl.clipToParent', 'bool') -bl.type('GuiButtonBaseCtrl.enabled', 'bool') -bl.type('GuiButtonBaseCtrl.visible', 'bool') +bl.type('GuiBorderButtonCtrl.clipToParent', 'boolean') +bl.type('GuiBorderButtonCtrl.enabled', 'boolean') +bl.type('GuiBorderButtonCtrl.visible', 'boolean') +bl.type('GuiBubbleTextCtrl.clipToParent', 'boolean') +bl.type('GuiBubbleTextCtrl.enabled', 'boolean') +bl.type('GuiBubbleTextCtrl.visible', 'boolean') +bl.type('GuiButtonBaseCtrl.clipToParent', 'boolean') +bl.type('GuiButtonBaseCtrl.enabled', 'boolean') +bl.type('GuiButtonBaseCtrl.visible', 'boolean') bl.type('GuiButtonBaseCtrl::getText:1', 'object') bl.type('GuiButtonBaseCtrl::performClick:1', 'object') bl.type('GuiButtonBaseCtrl::setText:1', 'object') -bl.type('GuiButtonCtrl.clipToParent', 'bool') -bl.type('GuiButtonCtrl.enabled', 'bool') -bl.type('GuiButtonCtrl.visible', 'bool') -bl.type('GuiCanvas.clipToParent', 'bool') -bl.type('GuiCanvas.enabled', 'bool') -bl.type('GuiCanvas.visible', 'bool') +bl.type('GuiButtonCtrl.clipToParent', 'boolean') +bl.type('GuiButtonCtrl.enabled', 'boolean') +bl.type('GuiButtonCtrl.visible', 'boolean') +bl.type('GuiCanvas.clipToParent', 'boolean') +bl.type('GuiCanvas.enabled', 'boolean') +bl.type('GuiCanvas.visible', 'boolean') bl.type('GuiCanvas::canTabFocus:1', 'object') -bl.type('GuiCanvas::canTabFocus:2', 'bool') +bl.type('GuiCanvas::canTabFocus:2', 'boolean') bl.type('GuiCanvas::checkCursor:1', 'object') bl.type('GuiCanvas::checkTabFocus:1', 'object') bl.type('GuiCanvas::cursorOff:1', 'object') @@ -1637,7 +1637,7 @@ bl.type('GuiCanvas::cursorOn:1', 'object') bl.type('GuiCanvas::getContent:1', 'object') bl.type('GuiCanvas::getCursorPos:1', 'object') bl.type('GuiCanvas::hideCursor:1', 'object') -bl.type('GuiCanvas::isCursorOn', 'bool') +bl.type('GuiCanvas::isCursorOn', 'boolean') bl.type('GuiCanvas::isCursorOn:1', 'object') bl.type('GuiCanvas::popDialog:1', 'object') bl.type('GuiCanvas::popDialog:2', 'object') @@ -1645,48 +1645,48 @@ bl.type('GuiCanvas::popLayer:1', 'object') bl.type('GuiCanvas::pushDialog:1', 'object') bl.type('GuiCanvas::pushDialog:2', 'object') bl.type('GuiCanvas::renderFront:1', 'object') -bl.type('GuiCanvas::renderFront:2', 'bool') +bl.type('GuiCanvas::renderFront:2', 'boolean') bl.type('GuiCanvas::repaint:1', 'object') bl.type('GuiCanvas::reset:1', 'object') bl.type('GuiCanvas::setContent:1', 'object') bl.type('GuiCanvas::setContent:2', 'object') bl.type('GuiCanvas::setCursor:1', 'object') -bl.type('GuiCanvas::setCursor:2', 'bool') +bl.type('GuiCanvas::setCursor:2', 'boolean') bl.type('GuiCanvas::setCursorPos:1', 'object') bl.type('GuiCanvas::showCursor:1', 'object') bl.type('GuiCanvas::tabNext:1', 'object') -bl.type('GuiCheckBoxCtrl.clipToParent', 'bool') -bl.type('GuiCheckBoxCtrl.enabled', 'bool') -bl.type('GuiCheckBoxCtrl.visible', 'bool') -bl.type('GuiChunkedBitmapCtrl.clipToParent', 'bool') -bl.type('GuiChunkedBitmapCtrl.enabled', 'bool') -bl.type('GuiChunkedBitmapCtrl.tile', 'bool') -bl.type('GuiChunkedBitmapCtrl.useVariable', 'bool') -bl.type('GuiChunkedBitmapCtrl.visible', 'bool') +bl.type('GuiCheckBoxCtrl.clipToParent', 'boolean') +bl.type('GuiCheckBoxCtrl.enabled', 'boolean') +bl.type('GuiCheckBoxCtrl.visible', 'boolean') +bl.type('GuiChunkedBitmapCtrl.clipToParent', 'boolean') +bl.type('GuiChunkedBitmapCtrl.enabled', 'boolean') +bl.type('GuiChunkedBitmapCtrl.tile', 'boolean') +bl.type('GuiChunkedBitmapCtrl.useVariable', 'boolean') +bl.type('GuiChunkedBitmapCtrl.visible', 'boolean') bl.type('GuiChunkedBitmapCtrl::setBitmap:1', 'object') -bl.type('GuiClockHud.clipToParent', 'bool') -bl.type('GuiClockHud.enabled', 'bool') -bl.type('GuiClockHud.showFill', 'bool') -bl.type('GuiClockHud.showFrame', 'bool') -bl.type('GuiClockHud.visible', 'bool') +bl.type('GuiClockHud.clipToParent', 'boolean') +bl.type('GuiClockHud.enabled', 'boolean') +bl.type('GuiClockHud.showFill', 'boolean') +bl.type('GuiClockHud.showFrame', 'boolean') +bl.type('GuiClockHud.visible', 'boolean') bl.type('GuiClockHud::getTime:1', 'object') bl.type('GuiClockHud::setTime:1', 'object') -bl.type('GuiConsole.clipToParent', 'bool') -bl.type('GuiConsole.enabled', 'bool') -bl.type('GuiConsole.visible', 'bool') -bl.type('GuiConsoleEditCtrl.clipToParent', 'bool') -bl.type('GuiConsoleEditCtrl.enabled', 'bool') -bl.type('GuiConsoleEditCtrl.password', 'bool') -bl.type('GuiConsoleEditCtrl.sinkAllKeyEvents', 'bool') -bl.type('GuiConsoleEditCtrl.tabComplete', 'bool') -bl.type('GuiConsoleEditCtrl.useSiblingScroller', 'bool') -bl.type('GuiConsoleEditCtrl.visible', 'bool') -bl.type('GuiConsoleTextCtrl.clipToParent', 'bool') -bl.type('GuiConsoleTextCtrl.enabled', 'bool') -bl.type('GuiConsoleTextCtrl.visible', 'bool') -bl.type('GuiControl.clipToParent', 'bool') -bl.type('GuiControl.enabled', 'bool') -bl.type('GuiControl.visible', 'bool') +bl.type('GuiConsole.clipToParent', 'boolean') +bl.type('GuiConsole.enabled', 'boolean') +bl.type('GuiConsole.visible', 'boolean') +bl.type('GuiConsoleEditCtrl.clipToParent', 'boolean') +bl.type('GuiConsoleEditCtrl.enabled', 'boolean') +bl.type('GuiConsoleEditCtrl.password', 'boolean') +bl.type('GuiConsoleEditCtrl.sinkAllKeyEvents', 'boolean') +bl.type('GuiConsoleEditCtrl.tabComplete', 'boolean') +bl.type('GuiConsoleEditCtrl.useSiblingScroller', 'boolean') +bl.type('GuiConsoleEditCtrl.visible', 'boolean') +bl.type('GuiConsoleTextCtrl.clipToParent', 'boolean') +bl.type('GuiConsoleTextCtrl.enabled', 'boolean') +bl.type('GuiConsoleTextCtrl.visible', 'boolean') +bl.type('GuiControl.clipToParent', 'boolean') +bl.type('GuiControl.enabled', 'boolean') +bl.type('GuiControl.visible', 'boolean') bl.type('GuiControl::ScaleText:1', 'object') bl.type('GuiControl::getExtent:1', 'object') bl.type('GuiControl::getHelpPage:1', 'object') @@ -1695,54 +1695,54 @@ bl.type('GuiControl::getMinExtent:1', 'object') bl.type('GuiControl::getPosition:1', 'object') bl.type('GuiControl::getScreenPosition:1', 'object') bl.type('GuiControl::getValue:1', 'object') -bl.type('GuiControl::isActive', 'bool') +bl.type('GuiControl::isActive', 'boolean') bl.type('GuiControl::isActive:1', 'object') -bl.type('GuiControl::isAwake', 'bool') +bl.type('GuiControl::isAwake', 'boolean') bl.type('GuiControl::isAwake:1', 'object') -bl.type('GuiControl::isVisible', 'bool') +bl.type('GuiControl::isVisible', 'boolean') bl.type('GuiControl::isVisible:1', 'object') bl.type('GuiControl::makeFirstResponder:1', 'object') -bl.type('GuiControl::makeFirstResponder:2', 'bool') +bl.type('GuiControl::makeFirstResponder:2', 'boolean') bl.type('GuiControl::resize:1', 'object') bl.type('GuiControl::setActive:1', 'object') -bl.type('GuiControl::setActive:2', 'bool') +bl.type('GuiControl::setActive:2', 'boolean') bl.type('GuiControl::setCentered:1', 'object') bl.type('GuiControl::setCenteredX:1', 'object') bl.type('GuiControl::setCenteredY:1', 'object') bl.type('GuiControl::setHasRendered:1', 'object') -bl.type('GuiControl::setHasRendered:2', 'bool') +bl.type('GuiControl::setHasRendered:2', 'boolean') bl.type('GuiControl::setProfile:1', 'object') bl.type('GuiControl::setProfile:2', 'object') bl.type('GuiControl::setValue:1', 'object') bl.type('GuiControl::setVisible:1', 'object') -bl.type('GuiControl::setVisible:2', 'bool') -bl.type('GuiControlListPopUp.clipToParent', 'bool') -bl.type('GuiControlListPopUp.enabled', 'bool') -bl.type('GuiControlListPopUp.visible', 'bool') -bl.type('GuiControlProfile.autoSizeHeight', 'bool') -bl.type('GuiControlProfile.autoSizeWidth', 'bool') -bl.type('GuiControlProfile.canKeyFocus', 'bool') -bl.type('GuiControlProfile.doFontOutline', 'bool') -bl.type('GuiControlProfile.modal', 'bool') -bl.type('GuiControlProfile.mouseOverSelected', 'bool') -bl.type('GuiControlProfile.numbersOnly', 'bool') -bl.type('GuiControlProfile.opaque', 'bool') -bl.type('GuiControlProfile.returnTab', 'bool') -bl.type('GuiControlProfile.tab', 'bool') +bl.type('GuiControl::setVisible:2', 'boolean') +bl.type('GuiControlListPopUp.clipToParent', 'boolean') +bl.type('GuiControlListPopUp.enabled', 'boolean') +bl.type('GuiControlListPopUp.visible', 'boolean') +bl.type('GuiControlProfile.autoSizeHeight', 'boolean') +bl.type('GuiControlProfile.autoSizeWidth', 'boolean') +bl.type('GuiControlProfile.canKeyFocus', 'boolean') +bl.type('GuiControlProfile.doFontOutline', 'boolean') +bl.type('GuiControlProfile.modal', 'boolean') +bl.type('GuiControlProfile.mouseOverSelected', 'boolean') +bl.type('GuiControlProfile.numbersOnly', 'boolean') +bl.type('GuiControlProfile.opaque', 'boolean') +bl.type('GuiControlProfile.returnTab', 'boolean') +bl.type('GuiControlProfile.tab', 'boolean') bl.type('GuiControlProfile::updateFont:1', 'object') -bl.type('GuiCrossHairHud.alignLeft', 'bool') -bl.type('GuiCrossHairHud.alignTop', 'bool') -bl.type('GuiCrossHairHud.clipToParent', 'bool') -bl.type('GuiCrossHairHud.enabled', 'bool') -bl.type('GuiCrossHairHud.keepCached', 'bool') -bl.type('GuiCrossHairHud.lockAspectRatio', 'bool') -bl.type('GuiCrossHairHud.mMultiply', 'bool') -bl.type('GuiCrossHairHud.overflowImage', 'bool') -bl.type('GuiCrossHairHud.visible', 'bool') -bl.type('GuiCrossHairHud.wrap', 'bool') -bl.type('GuiEditCtrl.clipToParent', 'bool') -bl.type('GuiEditCtrl.enabled', 'bool') -bl.type('GuiEditCtrl.visible', 'bool') +bl.type('GuiCrossHairHud.alignLeft', 'boolean') +bl.type('GuiCrossHairHud.alignTop', 'boolean') +bl.type('GuiCrossHairHud.clipToParent', 'boolean') +bl.type('GuiCrossHairHud.enabled', 'boolean') +bl.type('GuiCrossHairHud.keepCached', 'boolean') +bl.type('GuiCrossHairHud.lockAspectRatio', 'boolean') +bl.type('GuiCrossHairHud.mMultiply', 'boolean') +bl.type('GuiCrossHairHud.overflowImage', 'boolean') +bl.type('GuiCrossHairHud.visible', 'boolean') +bl.type('GuiCrossHairHud.wrap', 'boolean') +bl.type('GuiEditCtrl.clipToParent', 'boolean') +bl.type('GuiEditCtrl.enabled', 'boolean') +bl.type('GuiEditCtrl.visible', 'boolean') bl.type('GuiEditCtrl::addNewCtrl:1', 'object') bl.type('GuiEditCtrl::addNewCtrl:2', 'object') bl.type('GuiEditCtrl::bringToFront:1', 'object') @@ -1765,38 +1765,38 @@ bl.type('GuiEditorClassPopup::onSelect:1', 'object') bl.type('GuiEditorContentList::onSelect:1', 'object') bl.type('GuiEditorMenuBar::onMenuItemSelect:1', 'object') bl.type('GuiEditorResList::onSelect:1', 'object') -bl.type('GuiEditorRuler.clipToParent', 'bool') -bl.type('GuiEditorRuler.enabled', 'bool') -bl.type('GuiEditorRuler.visible', 'bool') +bl.type('GuiEditorRuler.clipToParent', 'boolean') +bl.type('GuiEditorRuler.enabled', 'boolean') +bl.type('GuiEditorRuler.visible', 'boolean') bl.type('GuiEditorTreeView::onSelect:1', 'object') -bl.type('GuiFadeinBitmapCtrl.alignLeft', 'bool') -bl.type('GuiFadeinBitmapCtrl.alignTop', 'bool') -bl.type('GuiFadeinBitmapCtrl.clipToParent', 'bool') -bl.type('GuiFadeinBitmapCtrl.enabled', 'bool') -bl.type('GuiFadeinBitmapCtrl.keepCached', 'bool') -bl.type('GuiFadeinBitmapCtrl.lockAspectRatio', 'bool') -bl.type('GuiFadeinBitmapCtrl.mMultiply', 'bool') -bl.type('GuiFadeinBitmapCtrl.overflowImage', 'bool') -bl.type('GuiFadeinBitmapCtrl.visible', 'bool') -bl.type('GuiFadeinBitmapCtrl.wrap', 'bool') +bl.type('GuiFadeinBitmapCtrl.alignLeft', 'boolean') +bl.type('GuiFadeinBitmapCtrl.alignTop', 'boolean') +bl.type('GuiFadeinBitmapCtrl.clipToParent', 'boolean') +bl.type('GuiFadeinBitmapCtrl.enabled', 'boolean') +bl.type('GuiFadeinBitmapCtrl.keepCached', 'boolean') +bl.type('GuiFadeinBitmapCtrl.lockAspectRatio', 'boolean') +bl.type('GuiFadeinBitmapCtrl.mMultiply', 'boolean') +bl.type('GuiFadeinBitmapCtrl.overflowImage', 'boolean') +bl.type('GuiFadeinBitmapCtrl.visible', 'boolean') +bl.type('GuiFadeinBitmapCtrl.wrap', 'boolean') bl.type('GuiFadeinBitmapCtrl::reset:1', 'object') -bl.type('GuiFilterCtrl.clipToParent', 'bool') -bl.type('GuiFilterCtrl.enabled', 'bool') -bl.type('GuiFilterCtrl.visible', 'bool') +bl.type('GuiFilterCtrl.clipToParent', 'boolean') +bl.type('GuiFilterCtrl.enabled', 'boolean') +bl.type('GuiFilterCtrl.visible', 'boolean') bl.type('GuiFilterCtrl::getValue:1', 'object') bl.type('GuiFilterCtrl::identity:1', 'object') bl.type('GuiFilterCtrl::setValue:1', 'object') -bl.type('GuiFrameSetCtrl.autoBalance', 'bool') -bl.type('GuiFrameSetCtrl.clipToParent', 'bool') -bl.type('GuiFrameSetCtrl.enabled', 'bool') -bl.type('GuiFrameSetCtrl.visible', 'bool') +bl.type('GuiFrameSetCtrl.autoBalance', 'boolean') +bl.type('GuiFrameSetCtrl.clipToParent', 'boolean') +bl.type('GuiFrameSetCtrl.enabled', 'boolean') +bl.type('GuiFrameSetCtrl.visible', 'boolean') bl.type('GuiFrameSetCtrl::addColumn:1', 'object') bl.type('GuiFrameSetCtrl::addRow:1', 'object') bl.type('GuiFrameSetCtrl::frameBorder:1', 'object') -bl.type('GuiFrameSetCtrl::frameBorder:3', 'bool') +bl.type('GuiFrameSetCtrl::frameBorder:3', 'boolean') bl.type('GuiFrameSetCtrl::frameMinExtent:1', 'object') bl.type('GuiFrameSetCtrl::frameMovable:1', 'object') -bl.type('GuiFrameSetCtrl::frameMovable:3', 'bool') +bl.type('GuiFrameSetCtrl::frameMovable:3', 'boolean') bl.type('GuiFrameSetCtrl::getColumnCount:1', 'object') bl.type('GuiFrameSetCtrl::getColumnOffset:1', 'object') bl.type('GuiFrameSetCtrl::getRowCount:1', 'object') @@ -1805,49 +1805,49 @@ bl.type('GuiFrameSetCtrl::removeColumn:1', 'object') bl.type('GuiFrameSetCtrl::removeRow:1', 'object') bl.type('GuiFrameSetCtrl::setColumnOffset:1', 'object') bl.type('GuiFrameSetCtrl::setRowOffset:1', 'object') -bl.type('GuiGraphCtrl.clipToParent', 'bool') -bl.type('GuiGraphCtrl.enabled', 'bool') -bl.type('GuiGraphCtrl.visible', 'bool') +bl.type('GuiGraphCtrl.clipToParent', 'boolean') +bl.type('GuiGraphCtrl.enabled', 'boolean') +bl.type('GuiGraphCtrl.visible', 'boolean') bl.type('GuiGraphCtrl::addAutoPlot:1', 'object') bl.type('GuiGraphCtrl::addDatum:1', 'object') bl.type('GuiGraphCtrl::getDatum:1', 'object') bl.type('GuiGraphCtrl::matchScale:1', 'object') bl.type('GuiGraphCtrl::removeAutoPlot:1', 'object') bl.type('GuiGraphCtrl::setGraphType:1', 'object') -bl.type('GuiHealthBarHud.clipToParent', 'bool') -bl.type('GuiHealthBarHud.displayEnergy', 'bool') -bl.type('GuiHealthBarHud.enabled', 'bool') -bl.type('GuiHealthBarHud.flipped', 'bool') -bl.type('GuiHealthBarHud.showFill', 'bool') -bl.type('GuiHealthBarHud.showFrame', 'bool') -bl.type('GuiHealthBarHud.visible', 'bool') -bl.type('GuiInputCtrl.clipToParent', 'bool') -bl.type('GuiInputCtrl.enabled', 'bool') -bl.type('GuiInputCtrl.visible', 'bool') -bl.type('GuiInspector.clipToParent', 'bool') -bl.type('GuiInspector.enabled', 'bool') -bl.type('GuiInspector.useFieldGrouping', 'bool') -bl.type('GuiInspector.visible', 'bool') +bl.type('GuiHealthBarHud.clipToParent', 'boolean') +bl.type('GuiHealthBarHud.displayEnergy', 'boolean') +bl.type('GuiHealthBarHud.enabled', 'boolean') +bl.type('GuiHealthBarHud.flipped', 'boolean') +bl.type('GuiHealthBarHud.showFill', 'boolean') +bl.type('GuiHealthBarHud.showFrame', 'boolean') +bl.type('GuiHealthBarHud.visible', 'boolean') +bl.type('GuiInputCtrl.clipToParent', 'boolean') +bl.type('GuiInputCtrl.enabled', 'boolean') +bl.type('GuiInputCtrl.visible', 'boolean') +bl.type('GuiInspector.clipToParent', 'boolean') +bl.type('GuiInspector.enabled', 'boolean') +bl.type('GuiInspector.useFieldGrouping', 'boolean') +bl.type('GuiInspector.visible', 'boolean') bl.type('GuiInspector::addDynamicField:1', 'object') bl.type('GuiInspector::apply:1', 'object') bl.type('GuiInspector::inspect:1', 'object') bl.type('GuiInspector::inspect:2', 'object') bl.type('GuiInspector::setAllGroupState:1', 'object') -bl.type('GuiInspector::setAllGroupState:2', 'bool') +bl.type('GuiInspector::setAllGroupState:2', 'boolean') bl.type('GuiInspector::setAllGroupStateScript:1', 'object') bl.type('GuiInspector::toggleDynamicGroupExpand:1', 'object') bl.type('GuiInspector::toggleDynamicGroupScript:1', 'object') bl.type('GuiInspector::toggleGroupExpand:1', 'object') bl.type('GuiInspector::toggleGroupExpand:2', 'object') bl.type('GuiInspector::toggleGroupScript:1', 'object') -bl.type('GuiMLTextCtrl.allowColorChars', 'bool') -bl.type('GuiMLTextCtrl.autoResize', 'bool') -bl.type('GuiMLTextCtrl.clipToParent', 'bool') -bl.type('GuiMLTextCtrl.enabled', 'bool') -bl.type('GuiMLTextCtrl.selectable', 'bool') -bl.type('GuiMLTextCtrl.visible', 'bool') +bl.type('GuiMLTextCtrl.allowColorChars', 'boolean') +bl.type('GuiMLTextCtrl.autoResize', 'boolean') +bl.type('GuiMLTextCtrl.clipToParent', 'boolean') +bl.type('GuiMLTextCtrl.enabled', 'boolean') +bl.type('GuiMLTextCtrl.selectable', 'boolean') +bl.type('GuiMLTextCtrl.visible', 'boolean') bl.type('GuiMLTextCtrl::addText:1', 'object') -bl.type('GuiMLTextCtrl::addText:3', 'bool') +bl.type('GuiMLTextCtrl::addText:3', 'boolean') bl.type('GuiMLTextCtrl::forceReflow:1', 'object') bl.type('GuiMLTextCtrl::getText:1', 'object') bl.type('GuiMLTextCtrl::onAdd:1', 'object') @@ -1855,18 +1855,18 @@ bl.type('GuiMLTextCtrl::onURL:1', 'object') bl.type('GuiMLTextCtrl::scrollToTag:1', 'object') bl.type('GuiMLTextCtrl::scrollToTop:1', 'object') bl.type('GuiMLTextCtrl::setAlpha:1', 'object') -bl.type('GuiMLTextCtrl::setCursorPosition', 'bool') +bl.type('GuiMLTextCtrl::setCursorPosition', 'boolean') bl.type('GuiMLTextCtrl::setCursorPosition:1', 'object') bl.type('GuiMLTextCtrl::setText:1', 'object') -bl.type('GuiMLTextEditCtrl.allowColorChars', 'bool') -bl.type('GuiMLTextEditCtrl.autoResize', 'bool') -bl.type('GuiMLTextEditCtrl.clipToParent', 'bool') -bl.type('GuiMLTextEditCtrl.enabled', 'bool') -bl.type('GuiMLTextEditCtrl.selectable', 'bool') -bl.type('GuiMLTextEditCtrl.visible', 'bool') -bl.type('GuiMenuBar.clipToParent', 'bool') -bl.type('GuiMenuBar.enabled', 'bool') -bl.type('GuiMenuBar.visible', 'bool') +bl.type('GuiMLTextEditCtrl.allowColorChars', 'boolean') +bl.type('GuiMLTextEditCtrl.autoResize', 'boolean') +bl.type('GuiMLTextEditCtrl.clipToParent', 'boolean') +bl.type('GuiMLTextEditCtrl.enabled', 'boolean') +bl.type('GuiMLTextEditCtrl.selectable', 'boolean') +bl.type('GuiMLTextEditCtrl.visible', 'boolean') +bl.type('GuiMenuBar.clipToParent', 'boolean') +bl.type('GuiMenuBar.enabled', 'boolean') +bl.type('GuiMenuBar.visible', 'boolean') bl.type('GuiMenuBar::addMenu:1', 'object') bl.type('GuiMenuBar::addMenuItem:1', 'object') bl.type('GuiMenuBar::clearMenuItems:1', 'object') @@ -1875,32 +1875,32 @@ bl.type('GuiMenuBar::removeMenu:1', 'object') bl.type('GuiMenuBar::removeMenuItem:1', 'object') bl.type('GuiMenuBar::setMenuItemBitmap:1', 'object') bl.type('GuiMenuBar::setMenuItemChecked:1', 'object') -bl.type('GuiMenuBar::setMenuItemChecked:4', 'bool') +bl.type('GuiMenuBar::setMenuItemChecked:4', 'boolean') bl.type('GuiMenuBar::setMenuItemEnable:1', 'object') -bl.type('GuiMenuBar::setMenuItemEnable:4', 'bool') +bl.type('GuiMenuBar::setMenuItemEnable:4', 'boolean') bl.type('GuiMenuBar::setMenuItemText:1', 'object') bl.type('GuiMenuBar::setMenuItemVisible:1', 'object') -bl.type('GuiMenuBar::setMenuItemVisible:4', 'bool') +bl.type('GuiMenuBar::setMenuItemVisible:4', 'boolean') bl.type('GuiMenuBar::setMenuText:1', 'object') bl.type('GuiMenuBar::setMenuVisible:1', 'object') -bl.type('GuiMenuBar::setMenuVisible:3', 'bool') -bl.type('GuiMessageVectorCtrl.clipToParent', 'bool') -bl.type('GuiMessageVectorCtrl.enabled', 'bool') -bl.type('GuiMessageVectorCtrl.visible', 'bool') -bl.type('GuiMessageVectorCtrl::attach', 'bool') +bl.type('GuiMenuBar::setMenuVisible:3', 'boolean') +bl.type('GuiMessageVectorCtrl.clipToParent', 'boolean') +bl.type('GuiMessageVectorCtrl.enabled', 'boolean') +bl.type('GuiMessageVectorCtrl.visible', 'boolean') +bl.type('GuiMessageVectorCtrl::attach', 'boolean') bl.type('GuiMessageVectorCtrl::attach:1', 'object') bl.type('GuiMessageVectorCtrl::attach:2', 'object') bl.type('GuiMessageVectorCtrl::detach:1', 'object') -bl.type('GuiMouseEventCtrl.clipToParent', 'bool') -bl.type('GuiMouseEventCtrl.enabled', 'bool') -bl.type('GuiMouseEventCtrl.lockMouse', 'bool') -bl.type('GuiMouseEventCtrl.visible', 'bool') -bl.type('GuiNoMouseCtrl.clipToParent', 'bool') -bl.type('GuiNoMouseCtrl.enabled', 'bool') -bl.type('GuiNoMouseCtrl.visible', 'bool') -bl.type('GuiObjectView.clipToParent', 'bool') -bl.type('GuiObjectView.enabled', 'bool') -bl.type('GuiObjectView.visible', 'bool') +bl.type('GuiMouseEventCtrl.clipToParent', 'boolean') +bl.type('GuiMouseEventCtrl.enabled', 'boolean') +bl.type('GuiMouseEventCtrl.lockMouse', 'boolean') +bl.type('GuiMouseEventCtrl.visible', 'boolean') +bl.type('GuiNoMouseCtrl.clipToParent', 'boolean') +bl.type('GuiNoMouseCtrl.enabled', 'boolean') +bl.type('GuiNoMouseCtrl.visible', 'boolean') +bl.type('GuiObjectView.clipToParent', 'boolean') +bl.type('GuiObjectView.enabled', 'boolean') +bl.type('GuiObjectView.visible', 'boolean') bl.type('GuiObjectView::dumpView:1', 'object') bl.type('GuiObjectView::hideNode:1', 'object') bl.type('GuiObjectView::loadDSQ:1', 'object') @@ -1918,14 +1918,14 @@ bl.type('GuiObjectView::setSequence:1', 'object') bl.type('GuiObjectView::setThreadPos:1', 'object') bl.type('GuiObjectView::unHideNode:1', 'object') bl.type('GuiObjectView::unMountObject:1', 'object') -bl.type('GuiPlayerView.clipToParent', 'bool') -bl.type('GuiPlayerView.enabled', 'bool') -bl.type('GuiPlayerView.visible', 'bool') +bl.type('GuiPlayerView.clipToParent', 'boolean') +bl.type('GuiPlayerView.enabled', 'boolean') +bl.type('GuiPlayerView.visible', 'boolean') bl.type('GuiPlayerView::setModel:1', 'object') bl.type('GuiPlayerView::setSeq:1', 'object') -bl.type('GuiPopUpMenuCtrl.clipToParent', 'bool') -bl.type('GuiPopUpMenuCtrl.enabled', 'bool') -bl.type('GuiPopUpMenuCtrl.visible', 'bool') +bl.type('GuiPopUpMenuCtrl.clipToParent', 'boolean') +bl.type('GuiPopUpMenuCtrl.enabled', 'boolean') +bl.type('GuiPopUpMenuCtrl.visible', 'boolean') bl.type('GuiPopUpMenuCtrl::add:1', 'object') bl.type('GuiPopUpMenuCtrl::addFront:1', 'object') bl.type('GuiPopUpMenuCtrl::addScheme:1', 'object') @@ -1938,81 +1938,81 @@ bl.type('GuiPopUpMenuCtrl::getText:1', 'object') bl.type('GuiPopUpMenuCtrl::getTextById:1', 'object') bl.type('GuiPopUpMenuCtrl::onRemove:1', 'object') bl.type('GuiPopUpMenuCtrl::replaceText:1', 'object') -bl.type('GuiPopUpMenuCtrl::replaceText:2', 'bool') +bl.type('GuiPopUpMenuCtrl::replaceText:2', 'boolean') bl.type('GuiPopUpMenuCtrl::setEnumContent:1', 'object') bl.type('GuiPopUpMenuCtrl::setSelected:1', 'object') bl.type('GuiPopUpMenuCtrl::setText:1', 'object') bl.type('GuiPopUpMenuCtrl::size:1', 'object') bl.type('GuiPopUpMenuCtrl::sort:1', 'object') -bl.type('GuiProgressCtrl.clipToParent', 'bool') -bl.type('GuiProgressCtrl.enabled', 'bool') -bl.type('GuiProgressCtrl.visible', 'bool') -bl.type('GuiRadioCtrl.clipToParent', 'bool') -bl.type('GuiRadioCtrl.enabled', 'bool') -bl.type('GuiRadioCtrl.visible', 'bool') -bl.type('GuiScrollCtrl.clipToParent', 'bool') -bl.type('GuiScrollCtrl.constantThumbHeight', 'bool') -bl.type('GuiScrollCtrl.enabled', 'bool') -bl.type('GuiScrollCtrl.visible', 'bool') -bl.type('GuiScrollCtrl.willFirstRespond', 'bool') +bl.type('GuiProgressCtrl.clipToParent', 'boolean') +bl.type('GuiProgressCtrl.enabled', 'boolean') +bl.type('GuiProgressCtrl.visible', 'boolean') +bl.type('GuiRadioCtrl.clipToParent', 'boolean') +bl.type('GuiRadioCtrl.enabled', 'boolean') +bl.type('GuiRadioCtrl.visible', 'boolean') +bl.type('GuiScrollCtrl.clipToParent', 'boolean') +bl.type('GuiScrollCtrl.constantThumbHeight', 'boolean') +bl.type('GuiScrollCtrl.enabled', 'boolean') +bl.type('GuiScrollCtrl.visible', 'boolean') +bl.type('GuiScrollCtrl.willFirstRespond', 'boolean') bl.type('GuiScrollCtrl::scrollToBottom:1', 'object') bl.type('GuiScrollCtrl::scrollToTop:1', 'object') -bl.type('GuiShapeNameHud.clipToParent', 'bool') -bl.type('GuiShapeNameHud.enabled', 'bool') -bl.type('GuiShapeNameHud.showFill', 'bool') -bl.type('GuiShapeNameHud.showFrame', 'bool') -bl.type('GuiShapeNameHud.visible', 'bool') -bl.type('GuiSliderCtrl.clipToParent', 'bool') -bl.type('GuiSliderCtrl.enabled', 'bool') -bl.type('GuiSliderCtrl.snap', 'bool') -bl.type('GuiSliderCtrl.visible', 'bool') +bl.type('GuiShapeNameHud.clipToParent', 'boolean') +bl.type('GuiShapeNameHud.enabled', 'boolean') +bl.type('GuiShapeNameHud.showFill', 'boolean') +bl.type('GuiShapeNameHud.showFrame', 'boolean') +bl.type('GuiShapeNameHud.visible', 'boolean') +bl.type('GuiSliderCtrl.clipToParent', 'boolean') +bl.type('GuiSliderCtrl.enabled', 'boolean') +bl.type('GuiSliderCtrl.snap', 'boolean') +bl.type('GuiSliderCtrl.visible', 'boolean') bl.type('GuiSliderCtrl::getValue:1', 'object') -bl.type('GuiSpeedometerHud.alignLeft', 'bool') -bl.type('GuiSpeedometerHud.alignTop', 'bool') -bl.type('GuiSpeedometerHud.clipToParent', 'bool') -bl.type('GuiSpeedometerHud.enabled', 'bool') -bl.type('GuiSpeedometerHud.keepCached', 'bool') -bl.type('GuiSpeedometerHud.lockAspectRatio', 'bool') -bl.type('GuiSpeedometerHud.mMultiply', 'bool') -bl.type('GuiSpeedometerHud.overflowImage', 'bool') -bl.type('GuiSpeedometerHud.visible', 'bool') -bl.type('GuiSpeedometerHud.wrap', 'bool') -bl.type('GuiSwatchCtrl.clipToParent', 'bool') -bl.type('GuiSwatchCtrl.enabled', 'bool') -bl.type('GuiSwatchCtrl.visible', 'bool') +bl.type('GuiSpeedometerHud.alignLeft', 'boolean') +bl.type('GuiSpeedometerHud.alignTop', 'boolean') +bl.type('GuiSpeedometerHud.clipToParent', 'boolean') +bl.type('GuiSpeedometerHud.enabled', 'boolean') +bl.type('GuiSpeedometerHud.keepCached', 'boolean') +bl.type('GuiSpeedometerHud.lockAspectRatio', 'boolean') +bl.type('GuiSpeedometerHud.mMultiply', 'boolean') +bl.type('GuiSpeedometerHud.overflowImage', 'boolean') +bl.type('GuiSpeedometerHud.visible', 'boolean') +bl.type('GuiSpeedometerHud.wrap', 'boolean') +bl.type('GuiSwatchCtrl.clipToParent', 'boolean') +bl.type('GuiSwatchCtrl.enabled', 'boolean') +bl.type('GuiSwatchCtrl.visible', 'boolean') bl.type('GuiSwatchCtrl::getColor:1', 'object') bl.type('GuiSwatchCtrl::setColor:1', 'object') -bl.type('GuiTSCtrl.clipToParent', 'bool') -bl.type('GuiTSCtrl.enabled', 'bool') -bl.type('GuiTSCtrl.visible', 'bool') -bl.type('GuiTextCtrl.clipToParent', 'bool') -bl.type('GuiTextCtrl.enabled', 'bool') -bl.type('GuiTextCtrl.visible', 'bool') +bl.type('GuiTSCtrl.clipToParent', 'boolean') +bl.type('GuiTSCtrl.enabled', 'boolean') +bl.type('GuiTSCtrl.visible', 'boolean') +bl.type('GuiTextCtrl.clipToParent', 'boolean') +bl.type('GuiTextCtrl.enabled', 'boolean') +bl.type('GuiTextCtrl.visible', 'boolean') bl.type('GuiTextCtrl::getPixelWidth:1', 'object') bl.type('GuiTextCtrl::setText:1', 'object') -bl.type('GuiTextEditCtrl.clipToParent', 'bool') -bl.type('GuiTextEditCtrl.enabled', 'bool') -bl.type('GuiTextEditCtrl.password', 'bool') -bl.type('GuiTextEditCtrl.sinkAllKeyEvents', 'bool') -bl.type('GuiTextEditCtrl.tabComplete', 'bool') -bl.type('GuiTextEditCtrl.visible', 'bool') +bl.type('GuiTextEditCtrl.clipToParent', 'boolean') +bl.type('GuiTextEditCtrl.enabled', 'boolean') +bl.type('GuiTextEditCtrl.password', 'boolean') +bl.type('GuiTextEditCtrl.sinkAllKeyEvents', 'boolean') +bl.type('GuiTextEditCtrl.tabComplete', 'boolean') +bl.type('GuiTextEditCtrl.visible', 'boolean') bl.type('GuiTextEditCtrl::getCursorPos:1', 'object') bl.type('GuiTextEditCtrl::restrictNumberInput:1', 'object') bl.type('GuiTextEditCtrl::setCursorPos:1', 'object') bl.type('GuiTextEditCtrl::updateHistorySize:1', 'object') -bl.type('GuiTextEditSliderCtrl.clipToParent', 'bool') -bl.type('GuiTextEditSliderCtrl.enabled', 'bool') -bl.type('GuiTextEditSliderCtrl.password', 'bool') -bl.type('GuiTextEditSliderCtrl.sinkAllKeyEvents', 'bool') -bl.type('GuiTextEditSliderCtrl.tabComplete', 'bool') -bl.type('GuiTextEditSliderCtrl.visible', 'bool') -bl.type('GuiTextListCtrl.clipColumnText', 'bool') -bl.type('GuiTextListCtrl.clipToParent', 'bool') -bl.type('GuiTextListCtrl.enabled', 'bool') -bl.type('GuiTextListCtrl.enumerate', 'bool') -bl.type('GuiTextListCtrl.fitParentWidth', 'bool') -bl.type('GuiTextListCtrl.resizeCell', 'bool') -bl.type('GuiTextListCtrl.visible', 'bool') +bl.type('GuiTextEditSliderCtrl.clipToParent', 'boolean') +bl.type('GuiTextEditSliderCtrl.enabled', 'boolean') +bl.type('GuiTextEditSliderCtrl.password', 'boolean') +bl.type('GuiTextEditSliderCtrl.sinkAllKeyEvents', 'boolean') +bl.type('GuiTextEditSliderCtrl.tabComplete', 'boolean') +bl.type('GuiTextEditSliderCtrl.visible', 'boolean') +bl.type('GuiTextListCtrl.clipColumnText', 'boolean') +bl.type('GuiTextListCtrl.clipToParent', 'boolean') +bl.type('GuiTextListCtrl.enabled', 'boolean') +bl.type('GuiTextListCtrl.enumerate', 'boolean') +bl.type('GuiTextListCtrl.fitParentWidth', 'boolean') +bl.type('GuiTextListCtrl.resizeCell', 'boolean') +bl.type('GuiTextListCtrl.visible', 'boolean') bl.type('GuiTextListCtrl::addRow:1', 'object') bl.type('GuiTextListCtrl::clear:1', 'object') bl.type('GuiTextListCtrl::clearSelection:1', 'object') @@ -2022,37 +2022,37 @@ bl.type('GuiTextListCtrl::getRowNumById:1', 'object') bl.type('GuiTextListCtrl::getRowText:1', 'object') bl.type('GuiTextListCtrl::getRowTextById:1', 'object') bl.type('GuiTextListCtrl::getSelectedId:1', 'object') -bl.type('GuiTextListCtrl::isRowActive', 'bool') +bl.type('GuiTextListCtrl::isRowActive', 'boolean') bl.type('GuiTextListCtrl::isRowActive:1', 'object') bl.type('GuiTextListCtrl::removeRow:1', 'object') bl.type('GuiTextListCtrl::removeRowById:1', 'object') bl.type('GuiTextListCtrl::rowCount:1', 'object') bl.type('GuiTextListCtrl::scrollVisible:1', 'object') bl.type('GuiTextListCtrl::setRowActive:1', 'object') -bl.type('GuiTextListCtrl::setRowActive:3', 'bool') +bl.type('GuiTextListCtrl::setRowActive:3', 'boolean') bl.type('GuiTextListCtrl::setRowById:1', 'object') bl.type('GuiTextListCtrl::setSelectedById:1', 'object') bl.type('GuiTextListCtrl::setSelectedRow:1', 'object') bl.type('GuiTextListCtrl::sort:1', 'object') -bl.type('GuiTextListCtrl::sort:3', 'bool') +bl.type('GuiTextListCtrl::sort:3', 'boolean') bl.type('GuiTextListCtrl::sortNumerical:1', 'object') -bl.type('GuiTextListCtrl::sortNumerical:3', 'bool') -bl.type('GuiTreeViewCtrl.allowMultipleSelections', 'bool') -bl.type('GuiTreeViewCtrl.clipToParent', 'bool') -bl.type('GuiTreeViewCtrl.enabled', 'bool') -bl.type('GuiTreeViewCtrl.recurseSets', 'bool') -bl.type('GuiTreeViewCtrl.visible', 'bool') +bl.type('GuiTextListCtrl::sortNumerical:3', 'boolean') +bl.type('GuiTreeViewCtrl.allowMultipleSelections', 'boolean') +bl.type('GuiTreeViewCtrl.clipToParent', 'boolean') +bl.type('GuiTreeViewCtrl.enabled', 'boolean') +bl.type('GuiTreeViewCtrl.recurseSets', 'boolean') +bl.type('GuiTreeViewCtrl.visible', 'boolean') bl.type('GuiTreeViewCtrl::open:1', 'object') bl.type('GuiTreeViewCtrl::open:2', 'object') -bl.type('GuiWindowCtrl.canClose', 'bool') -bl.type('GuiWindowCtrl.canMaximize', 'bool') -bl.type('GuiWindowCtrl.canMinimize', 'bool') -bl.type('GuiWindowCtrl.canMove', 'bool') -bl.type('GuiWindowCtrl.clipToParent', 'bool') -bl.type('GuiWindowCtrl.enabled', 'bool') -bl.type('GuiWindowCtrl.resizeHeight', 'bool') -bl.type('GuiWindowCtrl.resizeWidth', 'bool') -bl.type('GuiWindowCtrl.visible', 'bool') +bl.type('GuiWindowCtrl.canClose', 'boolean') +bl.type('GuiWindowCtrl.canMaximize', 'boolean') +bl.type('GuiWindowCtrl.canMinimize', 'boolean') +bl.type('GuiWindowCtrl.canMove', 'boolean') +bl.type('GuiWindowCtrl.clipToParent', 'boolean') +bl.type('GuiWindowCtrl.enabled', 'boolean') +bl.type('GuiWindowCtrl.resizeHeight', 'boolean') +bl.type('GuiWindowCtrl.resizeWidth', 'boolean') +bl.type('GuiWindowCtrl.visible', 'boolean') bl.type('HTTPObject::get:1', 'object') bl.type('HTTPObject::post:1', 'object') bl.type('HateImage::onDone:1', 'object') @@ -2075,37 +2075,37 @@ bl.type('HorseHoleBot::onBotFollow:1', 'object') bl.type('HorseHoleBot::onBotLoop:1', 'object') bl.type('InspectAddFieldDlg::doAction:1', 'object') bl.type('InspectTreeView::onSelect:1', 'object') -bl.type('Item.canSetIFLs', 'bool') -bl.type('Item.collideable', 'bool') -bl.type('Item.rotate', 'bool') -bl.type('Item.static', 'bool') +bl.type('Item.canSetIFLs', 'boolean') +bl.type('Item.collideable', 'boolean') +bl.type('Item.rotate', 'boolean') +bl.type('Item.static', 'boolean') bl.type('Item::Respawn:1', 'object') bl.type('Item::fadeIn:1', 'object') bl.type('Item::fadeOut:1', 'object') bl.type('Item::getLastStickyNormal:1', 'object') bl.type('Item::getLastStickyPos:1', 'object') bl.type('Item::getRespawnTime:1', 'object') -bl.type('Item::isRotating', 'bool') +bl.type('Item::isRotating', 'boolean') bl.type('Item::isRotating:1', 'object') -bl.type('Item::isStatic', 'bool') +bl.type('Item::isStatic', 'boolean') bl.type('Item::isStatic:1', 'object') bl.type('Item::schedulePop:1', 'object') -bl.type('Item::setCollisionTimeout', 'bool') +bl.type('Item::setCollisionTimeout', 'boolean') bl.type('Item::setCollisionTimeout:1', 'object') bl.type('Item::setCollisionTimeout:2', 'object') bl.type('Item::setRespawnTime:1', 'object') bl.type('Item::setThrower:1', 'object') -bl.type('ItemData.doColorShift', 'bool') -bl.type('ItemData.emap', 'bool') -bl.type('ItemData.firstPersonOnly', 'bool') -bl.type('ItemData.inheritEnergyFromMount', 'bool') -bl.type('ItemData.isInvincible', 'bool') -bl.type('ItemData.lightOnlyStatic', 'bool') -bl.type('ItemData.observeThroughObject', 'bool') -bl.type('ItemData.renderWhenDestroyed', 'bool') -bl.type('ItemData.sticky', 'bool') -bl.type('ItemData.thirdPersonOnly', 'bool') -bl.type('ItemData.useEyePoint', 'bool') +bl.type('ItemData.doColorShift', 'boolean') +bl.type('ItemData.emap', 'boolean') +bl.type('ItemData.firstPersonOnly', 'boolean') +bl.type('ItemData.inheritEnergyFromMount', 'boolean') +bl.type('ItemData.isInvincible', 'boolean') +bl.type('ItemData.lightOnlyStatic', 'boolean') +bl.type('ItemData.observeThroughObject', 'boolean') +bl.type('ItemData.renderWhenDestroyed', 'boolean') +bl.type('ItemData.sticky', 'boolean') +bl.type('ItemData.thirdPersonOnly', 'boolean') +bl.type('ItemData.useEyePoint', 'boolean') bl.type('ItemData::create:1', 'object') bl.type('ItemData::onAdd:1', 'object') bl.type('ItemData::onBallCollision:1', 'object') @@ -2132,7 +2132,7 @@ bl.type('JoinServerPassGui::enterPass:1', 'object') bl.type('LeftHandedGunImage::onFire:1', 'object') bl.type('LeftHandedGunImage::onMount:1', 'object') bl.type('LeftHandedGunImage::onUnMount:1', 'object') -bl.type('Lightning.useFog', 'bool') +bl.type('Lightning.useFog', 'boolean') bl.type('Lightning::strikeObject:1', 'object') bl.type('Lightning::strikeObject:2', 'object') bl.type('Lightning::strikeRandomPoint:1', 'object') @@ -2166,7 +2166,7 @@ bl.type('MessageBoxOKCancelDlg::onSleep:1', 'object') bl.type('MessageBoxOKDlg::onSleep:1', 'object') bl.type('MessageBoxYesNoDlg::onSleep:1', 'object') bl.type('MessageVector::clear:1', 'object') -bl.type('MessageVector::deleteLine', 'bool') +bl.type('MessageVector::deleteLine', 'boolean') bl.type('MessageVector::deleteLine:1', 'object') bl.type('MessageVector::dump:1', 'object') bl.type('MessageVector::getLineIndexByTag:1', 'object') @@ -2174,11 +2174,11 @@ bl.type('MessageVector::getLineTag:1', 'object') bl.type('MessageVector::getLineText:1', 'object') bl.type('MessageVector::getLineTextByTag:1', 'object') bl.type('MessageVector::getNumLines:1', 'object') -bl.type('MessageVector::insertLine', 'bool') +bl.type('MessageVector::insertLine', 'boolean') bl.type('MessageVector::insertLine:1', 'object') -bl.type('MessageVector::popBackLine', 'bool') +bl.type('MessageVector::popBackLine', 'boolean') bl.type('MessageVector::popBackLine:1', 'object') -bl.type('MessageVector::popFrontLine', 'bool') +bl.type('MessageVector::popFrontLine', 'boolean') bl.type('MessageVector::popFrontLine:1', 'object') bl.type('MessageVector::pushBackLine:1', 'object') bl.type('MessageVector::pushFrontLine:1', 'object') @@ -2189,15 +2189,15 @@ bl.type('MiniGameInviteGui::Ignore:1', 'object') bl.type('MiniGameInviteGui::onSleep:1', 'object') bl.type('MiniGameInviteGui::onWake:1', 'object') bl.type('MiniGameSO::reset:1', 'object') -bl.type('MissionMarker.canSetIFLs', 'bool') -bl.type('MissionMarkerData.emap', 'bool') -bl.type('MissionMarkerData.firstPersonOnly', 'bool') -bl.type('MissionMarkerData.inheritEnergyFromMount', 'bool') -bl.type('MissionMarkerData.isInvincible', 'bool') -bl.type('MissionMarkerData.observeThroughObject', 'bool') -bl.type('MissionMarkerData.renderWhenDestroyed', 'bool') -bl.type('MissionMarkerData.thirdPersonOnly', 'bool') -bl.type('MissionMarkerData.useEyePoint', 'bool') +bl.type('MissionMarker.canSetIFLs', 'boolean') +bl.type('MissionMarkerData.emap', 'boolean') +bl.type('MissionMarkerData.firstPersonOnly', 'boolean') +bl.type('MissionMarkerData.inheritEnergyFromMount', 'boolean') +bl.type('MissionMarkerData.isInvincible', 'boolean') +bl.type('MissionMarkerData.observeThroughObject', 'boolean') +bl.type('MissionMarkerData.renderWhenDestroyed', 'boolean') +bl.type('MissionMarkerData.thirdPersonOnly', 'boolean') +bl.type('MissionMarkerData.useEyePoint', 'boolean') bl.type('MissionMarkerData::create:1', 'object') bl.type('NMH_Type::send:1', 'object') bl.type('NMH_Type::type:1', 'object') @@ -2208,7 +2208,7 @@ bl.type('NetConnection::connect:1', 'object') bl.type('NetConnection::connectArranged:1', 'object') bl.type('NetConnection::connectLocal:1', 'object') bl.type('NetConnection::getAddress:1', 'object') -bl.type('NetConnection::getFinishedInitialGhost', 'bool') +bl.type('NetConnection::getFinishedInitialGhost', 'boolean') bl.type('NetConnection::getFinishedInitialGhost:1', 'object') bl.type('NetConnection::getGhostID:1', 'object') bl.type('NetConnection::getGhostsActive:1', 'object') @@ -2217,18 +2217,18 @@ bl.type('NetConnection::getPing:1', 'object') bl.type('NetConnection::getPort:1', 'object') bl.type('NetConnection::getProtocolVersion:1', 'object') bl.type('NetConnection::getRawIP:1', 'object') -bl.type('NetConnection::isLan', 'bool') +bl.type('NetConnection::isLan', 'boolean') bl.type('NetConnection::isLan:1', 'object') -bl.type('NetConnection::isLocal', 'bool') +bl.type('NetConnection::isLocal', 'boolean') bl.type('NetConnection::isLocal:1', 'object') -bl.type('NetConnection::isLocalConnection', 'bool') +bl.type('NetConnection::isLocalConnection', 'boolean') bl.type('NetConnection::isLocalConnection:1', 'object') bl.type('NetConnection::resolveGhostID:1', 'object') bl.type('NetConnection::resolveObjectFromGhostIndex', 'object') bl.type('NetConnection::resolveObjectFromGhostIndex:1', 'object') bl.type('NetConnection::sendDisconnectPacket:1', 'object') bl.type('NetConnection::setFinishedInitialGhost:1', 'object') -bl.type('NetConnection::setFinishedInitialGhost:2', 'bool') +bl.type('NetConnection::setFinishedInitialGhost:2', 'boolean') bl.type('NetConnection::transmitPaths:1', 'object') bl.type('NetGraph::cancel:1', 'object') bl.type('NetGraph::toggleKey:1', 'object') @@ -2243,7 +2243,7 @@ bl.type('NewChatSO::addLine:1', 'object') bl.type('NewPlayerListGui::clickList:1', 'object') bl.type('NewPlayerListGui::onWake:1', 'object') bl.type('Observer::onTrigger:1', 'object') -bl.type('OpenALInitDriver', 'bool') +bl.type('OpenALInitDriver', 'boolean') bl.type('OptAudioDriverList::onSelect:1', 'object') bl.type('OptGraphicsBPPMenu::init:1', 'object') bl.type('OptGraphicsBorderlessToggle::onAction:1', 'object') @@ -2268,8 +2268,8 @@ bl.type('PSD_Window::ShowAllPrintRatiosTab:1', 'object') bl.type('PainHighImage::onDone:1', 'object') bl.type('PainLowImage::onDone:1', 'object') bl.type('PainMidImage::onDone:1', 'object') -bl.type('ParticleData.animateTexture', 'bool') -bl.type('ParticleData.useInvAlpha', 'bool') +bl.type('ParticleData.animateTexture', 'boolean') +bl.type('ParticleData.useInvAlpha', 'boolean') bl.type('ParticleData::reload:1', 'object') bl.type('ParticleEditor::initEditor:1', 'object') bl.type('ParticleEditor::openEmitterPane:1', 'object') @@ -2277,23 +2277,23 @@ bl.type('ParticleEditor::openParticlePane:1', 'object') bl.type('ParticleEditor::resetEmitterNode:1', 'object') bl.type('ParticleEditor::startup:1', 'object') bl.type('ParticleEditor::updateEmitterNode:1', 'object') -bl.type('ParticleEmitterData.doDetail', 'bool') -bl.type('ParticleEmitterData.doFalloff', 'bool') -bl.type('ParticleEmitterData.orientOnVelocity', 'bool') -bl.type('ParticleEmitterData.orientParticles', 'bool') -bl.type('ParticleEmitterData.overrideAdvance', 'bool') -bl.type('ParticleEmitterData.useEmitterColors', 'bool') -bl.type('ParticleEmitterData.useEmitterSizes', 'bool') +bl.type('ParticleEmitterData.doDetail', 'boolean') +bl.type('ParticleEmitterData.doFalloff', 'boolean') +bl.type('ParticleEmitterData.orientOnVelocity', 'boolean') +bl.type('ParticleEmitterData.orientParticles', 'boolean') +bl.type('ParticleEmitterData.overrideAdvance', 'boolean') +bl.type('ParticleEmitterData.useEmitterColors', 'boolean') +bl.type('ParticleEmitterData.useEmitterSizes', 'boolean') bl.type('ParticleEmitterData::reload:1', 'object') -bl.type('ParticleEmitterNode.pointPlacement', 'bool') -bl.type('ParticleEmitterNode.spherePlacement', 'bool') +bl.type('ParticleEmitterNode.pointPlacement', 'boolean') +bl.type('ParticleEmitterNode.spherePlacement', 'boolean') bl.type('ParticleEmitterNode::getEmitterDataBlock:1', 'object') bl.type('ParticleEmitterNode::onRemove:1', 'object') bl.type('ParticleEmitterNode::setColor:1', 'object') bl.type('ParticleEmitterNode::setEmitterDataBlock:1', 'object') -bl.type('Path.isLooping', 'bool') +bl.type('Path.isLooping', 'boolean') bl.type('Path::getPathId:1', 'object') -bl.type('PathCamera.canSetIFLs', 'bool') +bl.type('PathCamera.canSetIFLs', 'boolean') bl.type('PathCamera::popFront:1', 'object') bl.type('PathCamera::pushBack:1', 'object') bl.type('PathCamera::pushFront:1', 'object') @@ -2301,24 +2301,24 @@ bl.type('PathCamera::reset:1', 'object') bl.type('PathCamera::setPosition:1', 'object') bl.type('PathCamera::setState:1', 'object') bl.type('PathCamera::setTarget:1', 'object') -bl.type('PathCameraData.emap', 'bool') -bl.type('PathCameraData.firstPersonOnly', 'bool') -bl.type('PathCameraData.inheritEnergyFromMount', 'bool') -bl.type('PathCameraData.isInvincible', 'bool') -bl.type('PathCameraData.observeThroughObject', 'bool') -bl.type('PathCameraData.renderWhenDestroyed', 'bool') -bl.type('PathCameraData.thirdPersonOnly', 'bool') -bl.type('PathCameraData.useEyePoint', 'bool') -bl.type('PhysicalZone.isWater', 'bool') +bl.type('PathCameraData.emap', 'boolean') +bl.type('PathCameraData.firstPersonOnly', 'boolean') +bl.type('PathCameraData.inheritEnergyFromMount', 'boolean') +bl.type('PathCameraData.isInvincible', 'boolean') +bl.type('PathCameraData.observeThroughObject', 'boolean') +bl.type('PathCameraData.renderWhenDestroyed', 'boolean') +bl.type('PathCameraData.thirdPersonOnly', 'boolean') +bl.type('PathCameraData.useEyePoint', 'boolean') +bl.type('PhysicalZone.isWater', 'boolean') bl.type('PhysicalZone::activate:1', 'object') bl.type('PhysicalZone::deactivate:1', 'object') bl.type('PhysicalZone::sendUpdate:1', 'object') bl.type('PhysicalZone::setAppliedForce:1', 'object') bl.type('PhysicalZone::setWaterColor:1', 'object') bl.type('PlayGui::createInvHUD:1', 'object') -bl.type('Player.canSetIFLs', 'bool') +bl.type('Player.canSetIFLs', 'boolean') bl.type('Player::ActivateStuff:1', 'object') -bl.type('Player::checkDismountPoint', 'bool') +bl.type('Player::checkDismountPoint', 'boolean') bl.type('Player::checkDismountPoint:1', 'object') bl.type('Player::clearControlObject:1', 'object') bl.type('Player::emote:1', 'object') @@ -2334,26 +2334,26 @@ bl.type('Player::getMaxUnderwaterBackwardSpeed:1', 'object') bl.type('Player::getMaxUnderwaterForwardSpeed:1', 'object') bl.type('Player::getMaxUnderwaterSideSpeed:1', 'object') bl.type('Player::getState:1', 'object') -bl.type('Player::getWorldSpaceMovement', 'bool') +bl.type('Player::getWorldSpaceMovement', 'boolean') bl.type('Player::getWorldSpaceMovement:1', 'object') -bl.type('Player::isCrouched', 'bool') +bl.type('Player::isCrouched', 'boolean') bl.type('Player::isCrouched:1', 'object') -bl.type('Player::isFirstPerson', 'bool') +bl.type('Player::isFirstPerson', 'boolean') bl.type('Player::isFirstPerson:1', 'object') -bl.type('Player::setActionThread', 'bool') +bl.type('Player::setActionThread', 'boolean') bl.type('Player::setActionThread:1', 'object') -bl.type('Player::setActionThread:3', 'bool') -bl.type('Player::setActionThread:4', 'bool') -bl.type('Player::setArmThread', 'bool') +bl.type('Player::setActionThread:3', 'boolean') +bl.type('Player::setActionThread:4', 'boolean') +bl.type('Player::setArmThread', 'boolean') bl.type('Player::setArmThread:1', 'object') -bl.type('Player::setControlObject', 'bool') +bl.type('Player::setControlObject', 'boolean') bl.type('Player::setControlObject:1', 'object') bl.type('Player::setControlObject:2', 'object') bl.type('Player::setDecalName:1', 'object') bl.type('Player::setFaceName:1', 'object') -bl.type('Player::setHeadUp', 'bool') +bl.type('Player::setHeadUp', 'boolean') bl.type('Player::setHeadUp:1', 'object') -bl.type('Player::setHeadUp:2', 'bool') +bl.type('Player::setHeadUp:2', 'boolean') bl.type('Player::setLookLimits:1', 'object') bl.type('Player::setMaxBackwardSpeed:1', 'object') bl.type('Player::setMaxCrouchBackwardSpeed:1', 'object') @@ -2365,27 +2365,27 @@ bl.type('Player::setMaxUnderwaterBackwardSpeed:1', 'object') bl.type('Player::setMaxUnderwaterForwardSpeed:1', 'object') bl.type('Player::setMaxUnderwaterSideSpeed:1', 'object') bl.type('Player::setWorldSpaceMovement:1', 'object') -bl.type('Player::setWorldSpaceMovement:2', 'bool') -bl.type('PlayerData.canJet', 'bool') -bl.type('PlayerData.canRide', 'bool') -bl.type('PlayerData.emap', 'bool') -bl.type('PlayerData.firstPersonOnly', 'bool') -bl.type('PlayerData.inheritEnergyFromMount', 'bool') -bl.type('PlayerData.isInvincible', 'bool') -bl.type('PlayerData.observeThroughObject', 'bool') -bl.type('PlayerData.renderFirstPerson', 'bool') -bl.type('PlayerData.renderWhenDestroyed', 'bool') -bl.type('PlayerData.rideAble', 'bool') -bl.type('PlayerData.thirdPersonOnly', 'bool') -bl.type('PlayerData.useEyePoint', 'bool') +bl.type('Player::setWorldSpaceMovement:2', 'boolean') +bl.type('PlayerData.canJet', 'boolean') +bl.type('PlayerData.canRide', 'boolean') +bl.type('PlayerData.emap', 'boolean') +bl.type('PlayerData.firstPersonOnly', 'boolean') +bl.type('PlayerData.inheritEnergyFromMount', 'boolean') +bl.type('PlayerData.isInvincible', 'boolean') +bl.type('PlayerData.observeThroughObject', 'boolean') +bl.type('PlayerData.renderFirstPerson', 'boolean') +bl.type('PlayerData.renderWhenDestroyed', 'boolean') +bl.type('PlayerData.rideAble', 'boolean') +bl.type('PlayerData.thirdPersonOnly', 'boolean') +bl.type('PlayerData.useEyePoint', 'boolean') bl.type('PlayerData::onDriverLeave:1', 'object') bl.type('PlayerSportArmor::onTrigger:1', 'object') bl.type('PlayerSportTurboArmor::onTrigger:1', 'object') bl.type('PlayerTeleportImage::onDone:1', 'object') -bl.type('Precipitation.doCollision', 'bool') -bl.type('Precipitation.rotateWithCamVel', 'bool') -bl.type('Precipitation.useTrueBillboards', 'bool') -bl.type('Precipitation.useTurbulence', 'bool') +bl.type('Precipitation.doCollision', 'boolean') +bl.type('Precipitation.rotateWithCamVel', 'boolean') +bl.type('Precipitation.useTrueBillboards', 'boolean') +bl.type('Precipitation.useTurbulence', 'boolean') bl.type('Precipitation::setPercentange:1', 'object') bl.type('PrintGunImage::onFire:1', 'object') bl.type('PrintGunImage::onHitObject:1', 'object') @@ -2401,12 +2401,12 @@ bl.type('Projectile::getLastImpactVelocity:1', 'object') bl.type('Projectile::getVelocity:1', 'object') bl.type('Projectile::onAdd:1', 'object') bl.type('Projectile::playSportBallSound:1', 'object') -bl.type('ProjectileData.collideWithPlayers', 'bool') -bl.type('ProjectileData.explodeOnDeath', 'bool') -bl.type('ProjectileData.explodeOnPlayerImpact', 'bool') -bl.type('ProjectileData.hasLight', 'bool') -bl.type('ProjectileData.hasWaterLight', 'bool') -bl.type('ProjectileData.isBallistic', 'bool') +bl.type('ProjectileData.collideWithPlayers', 'boolean') +bl.type('ProjectileData.explodeOnDeath', 'boolean') +bl.type('ProjectileData.explodeOnPlayerImpact', 'boolean') +bl.type('ProjectileData.hasLight', 'boolean') +bl.type('ProjectileData.hasWaterLight', 'boolean') +bl.type('ProjectileData.isBallistic', 'boolean') bl.type('ProjectileData::Damage:1', 'object') bl.type('ProjectileData::impactImpulse:1', 'object') bl.type('ProjectileData::onCollision:1', 'object') @@ -2416,7 +2416,7 @@ bl.type('ProjectileData::radiusImpulse:1', 'object') bl.type('QueueSO::dumpVals:1', 'object') bl.type('QueueSO::pop:1', 'object') bl.type('QueueSO::push:1', 'object') -bl.type('QuotaObject.AutoDelete', 'bool') +bl.type('QuotaObject.AutoDelete', 'boolean') bl.type('QuotaObject::dumpAllocs:1', 'object') bl.type('QuotaObject::getAllocs_Schedules:1', 'object') bl.type('QuotaObject::killObjects:1', 'object') @@ -2450,7 +2450,7 @@ bl.type('SceneObject::getWorldBox:1', 'object') bl.type('SceneObject::getWorldBoxCenter:1', 'object') bl.type('SceneObject::setScale:1', 'object') bl.type('SceneObject::setTransform:1', 'object') -bl.type('ScopeAlwaysShape.canSetIFLs', 'bool') +bl.type('ScopeAlwaysShape.canSetIFLs', 'boolean') bl.type('ScriptObject::getVariable:1', 'object') bl.type('ScriptObject::setVariable:1', 'object') bl.type('SelectNetworkGui::onSleep:1', 'object') @@ -2468,12 +2468,12 @@ bl.type('ServerSettingsGui::getVariablesFromFile:1', 'object') bl.type('ServerSettingsGui::getVariablesFromGui:1', 'object') bl.type('ServerSettingsGui::onRender:1', 'object') bl.type('ServerSettingsGui::onWake:1', 'object') -bl.type('ShapeBase.canSetIFLs', 'bool') +bl.type('ShapeBase.canSetIFLs', 'boolean') bl.type('ShapeBase::applyDamage:1', 'object') -bl.type('ShapeBase::applyImpulse', 'bool') +bl.type('ShapeBase::applyImpulse', 'boolean') bl.type('ShapeBase::applyImpulse:1', 'object') bl.type('ShapeBase::applyRepair:1', 'object') -bl.type('ShapeBase::canCloak', 'bool') +bl.type('ShapeBase::canCloak', 'boolean') bl.type('ShapeBase::canCloak:1', 'object') bl.type('ShapeBase::disableNodeColor:1', 'object') bl.type('ShapeBase::getCameraFov:1', 'object') @@ -2489,13 +2489,13 @@ bl.type('ShapeBase::getEnergyPercent:1', 'object') bl.type('ShapeBase::getEyePoint:1', 'object') bl.type('ShapeBase::getEyeTransform:1', 'object') bl.type('ShapeBase::getEyeVector:1', 'object') -bl.type('ShapeBase::getImageAmmo', 'bool') +bl.type('ShapeBase::getImageAmmo', 'boolean') bl.type('ShapeBase::getImageAmmo:1', 'object') -bl.type('ShapeBase::getImageLoaded', 'bool') +bl.type('ShapeBase::getImageLoaded', 'boolean') bl.type('ShapeBase::getImageLoaded:1', 'object') bl.type('ShapeBase::getImageSkinTag:1', 'object') bl.type('ShapeBase::getImageState:1', 'object') -bl.type('ShapeBase::getImageTrigger', 'bool') +bl.type('ShapeBase::getImageTrigger', 'boolean') bl.type('ShapeBase::getImageTrigger:1', 'object') bl.type('ShapeBase::getMountNode:1', 'object') bl.type('ShapeBase::getMountNodeObject', 'object') @@ -2522,117 +2522,117 @@ bl.type('ShapeBase::getVelocity:1', 'object') bl.type('ShapeBase::getWaterCoverage:1', 'object') bl.type('ShapeBase::getWhiteOut:1', 'object') bl.type('ShapeBase::hideNode:1', 'object') -bl.type('ShapeBase::isCloaked', 'bool') +bl.type('ShapeBase::isCloaked', 'boolean') bl.type('ShapeBase::isCloaked:1', 'object') -bl.type('ShapeBase::isDestroyed', 'bool') +bl.type('ShapeBase::isDestroyed', 'boolean') bl.type('ShapeBase::isDestroyed:1', 'object') -bl.type('ShapeBase::isDisabled', 'bool') +bl.type('ShapeBase::isDisabled', 'boolean') bl.type('ShapeBase::isDisabled:1', 'object') -bl.type('ShapeBase::isEnabled', 'bool') +bl.type('ShapeBase::isEnabled', 'boolean') bl.type('ShapeBase::isEnabled:1', 'object') -bl.type('ShapeBase::isHidden', 'bool') +bl.type('ShapeBase::isHidden', 'boolean') bl.type('ShapeBase::isHidden:1', 'object') -bl.type('ShapeBase::isImageFiring', 'bool') +bl.type('ShapeBase::isImageFiring', 'boolean') bl.type('ShapeBase::isImageFiring:1', 'object') -bl.type('ShapeBase::isImageMounted', 'bool') +bl.type('ShapeBase::isImageMounted', 'boolean') bl.type('ShapeBase::isImageMounted:1', 'object') bl.type('ShapeBase::isImageMounted:2', 'object') -bl.type('ShapeBase::isMounted', 'bool') +bl.type('ShapeBase::isMounted', 'boolean') bl.type('ShapeBase::isMounted:1', 'object') -bl.type('ShapeBase::isNodeVisible', 'bool') +bl.type('ShapeBase::isNodeVisible', 'boolean') bl.type('ShapeBase::isNodeVisible:1', 'object') -bl.type('ShapeBase::mountImage', 'bool') +bl.type('ShapeBase::mountImage', 'boolean') bl.type('ShapeBase::mountImage:1', 'object') bl.type('ShapeBase::mountImage:2', 'object') -bl.type('ShapeBase::mountImage:4', 'bool') -bl.type('ShapeBase::mountObject', 'bool') +bl.type('ShapeBase::mountImage:4', 'boolean') +bl.type('ShapeBase::mountObject', 'boolean') bl.type('ShapeBase::mountObject:1', 'object') bl.type('ShapeBase::mountObject:2', 'object') bl.type('ShapeBase::mountObject:3', 'object') -bl.type('ShapeBase::pauseThread', 'bool') +bl.type('ShapeBase::pauseThread', 'boolean') bl.type('ShapeBase::pauseThread:1', 'object') -bl.type('ShapeBase::playAudio', 'bool') +bl.type('ShapeBase::playAudio', 'boolean') bl.type('ShapeBase::playAudio:1', 'object') bl.type('ShapeBase::playAudio:3', 'object') -bl.type('ShapeBase::playThread', 'bool') +bl.type('ShapeBase::playThread', 'boolean') bl.type('ShapeBase::playThread:1', 'object') bl.type('ShapeBase::setCameraFov:1', 'object') bl.type('ShapeBase::setCloaked:1', 'object') -bl.type('ShapeBase::setCloaked:2', 'bool') +bl.type('ShapeBase::setCloaked:2', 'boolean') bl.type('ShapeBase::setDamageFlash:1', 'object') bl.type('ShapeBase::setDamageLevel:1', 'object') -bl.type('ShapeBase::setDamageState', 'bool') +bl.type('ShapeBase::setDamageState', 'boolean') bl.type('ShapeBase::setDamageState:1', 'object') bl.type('ShapeBase::setDamageVector:1', 'object') bl.type('ShapeBase::setEnergyLevel:1', 'object') bl.type('ShapeBase::setHidden:1', 'object') -bl.type('ShapeBase::setHidden:2', 'bool') +bl.type('ShapeBase::setHidden:2', 'boolean') bl.type('ShapeBase::setIflFrame:1', 'object') -bl.type('ShapeBase::setImageAmmo', 'bool') +bl.type('ShapeBase::setImageAmmo', 'boolean') bl.type('ShapeBase::setImageAmmo:1', 'object') -bl.type('ShapeBase::setImageAmmo:3', 'bool') -bl.type('ShapeBase::setImageLoaded', 'bool') +bl.type('ShapeBase::setImageAmmo:3', 'boolean') +bl.type('ShapeBase::setImageLoaded', 'boolean') bl.type('ShapeBase::setImageLoaded:1', 'object') -bl.type('ShapeBase::setImageLoaded:3', 'bool') -bl.type('ShapeBase::setImageTrigger', 'bool') +bl.type('ShapeBase::setImageLoaded:3', 'boolean') +bl.type('ShapeBase::setImageTrigger', 'boolean') bl.type('ShapeBase::setImageTrigger:1', 'object') -bl.type('ShapeBase::setImageTrigger:3', 'bool') +bl.type('ShapeBase::setImageTrigger:3', 'boolean') bl.type('ShapeBase::setNodeColor:1', 'object') bl.type('ShapeBase::setRepairRate:1', 'object') bl.type('ShapeBase::setShapeName:1', 'object') bl.type('ShapeBase::setShapeNameColor:1', 'object') bl.type('ShapeBase::setShapeNameDistance:1', 'object') bl.type('ShapeBase::setSkinName:1', 'object') -bl.type('ShapeBase::setThreadDir', 'bool') +bl.type('ShapeBase::setThreadDir', 'boolean') bl.type('ShapeBase::setThreadDir:1', 'object') -bl.type('ShapeBase::setThreadDir:3', 'bool') -bl.type('ShapeBase::setVelocity', 'bool') +bl.type('ShapeBase::setThreadDir:3', 'boolean') +bl.type('ShapeBase::setVelocity', 'boolean') bl.type('ShapeBase::setVelocity:1', 'object') bl.type('ShapeBase::setWhiteOut:1', 'object') bl.type('ShapeBase::startFade:1', 'object') -bl.type('ShapeBase::startFade:4', 'bool') -bl.type('ShapeBase::stopAudio', 'bool') +bl.type('ShapeBase::startFade:4', 'boolean') +bl.type('ShapeBase::stopAudio', 'boolean') bl.type('ShapeBase::stopAudio:1', 'object') -bl.type('ShapeBase::stopThread', 'bool') +bl.type('ShapeBase::stopThread', 'boolean') bl.type('ShapeBase::stopThread:1', 'object') bl.type('ShapeBase::unHideNode:1', 'object') -bl.type('ShapeBase::unMountObject', 'bool') +bl.type('ShapeBase::unMountObject', 'boolean') bl.type('ShapeBase::unMountObject:1', 'object') bl.type('ShapeBase::unMountObject:2', 'object') bl.type('ShapeBase::unmount:1', 'object') -bl.type('ShapeBase::unmountImage', 'bool') +bl.type('ShapeBase::unmountImage', 'boolean') bl.type('ShapeBase::unmountImage:1', 'object') -bl.type('ShapeBaseData.emap', 'bool') -bl.type('ShapeBaseData.firstPersonOnly', 'bool') -bl.type('ShapeBaseData.inheritEnergyFromMount', 'bool') -bl.type('ShapeBaseData.isInvincible', 'bool') -bl.type('ShapeBaseData.observeThroughObject', 'bool') -bl.type('ShapeBaseData.renderWhenDestroyed', 'bool') -bl.type('ShapeBaseData.thirdPersonOnly', 'bool') -bl.type('ShapeBaseData.useEyePoint', 'bool') +bl.type('ShapeBaseData.emap', 'boolean') +bl.type('ShapeBaseData.firstPersonOnly', 'boolean') +bl.type('ShapeBaseData.inheritEnergyFromMount', 'boolean') +bl.type('ShapeBaseData.isInvincible', 'boolean') +bl.type('ShapeBaseData.observeThroughObject', 'boolean') +bl.type('ShapeBaseData.renderWhenDestroyed', 'boolean') +bl.type('ShapeBaseData.thirdPersonOnly', 'boolean') +bl.type('ShapeBaseData.useEyePoint', 'boolean') bl.type('ShapeBaseData::Damage:1', 'object') -bl.type('ShapeBaseData::checkDeployPos', 'bool') +bl.type('ShapeBaseData::checkDeployPos', 'boolean') bl.type('ShapeBaseData::checkDeployPos:1', 'object') bl.type('ShapeBaseData::getDeployTransform:1', 'object') bl.type('ShapeBaseData::onInventory:1', 'object') bl.type('ShapeBaseData::onPickup:1', 'object') bl.type('ShapeBaseData::onThrow:1', 'object') bl.type('ShapeBaseData::onUse:1', 'object') -bl.type('ShapeBaseImageData.accuFire', 'bool') -bl.type('ShapeBaseImageData.cloakable', 'bool') -bl.type('ShapeBaseImageData.correctMuzzleVector', 'bool') -bl.type('ShapeBaseImageData.doColorShift', 'bool') -bl.type('ShapeBaseImageData.emap', 'bool') -bl.type('ShapeBaseImageData.firstPerson', 'bool') -bl.type('ShapeBaseImageData.firstPersonParticles', 'bool') -bl.type('ShapeBaseImageData.stateAllowImageChange', 'bool') -bl.type('ShapeBaseImageData.stateDirection', 'bool') -bl.type('ShapeBaseImageData.stateEjectShell', 'bool') -bl.type('ShapeBaseImageData.stateFire', 'bool') -bl.type('ShapeBaseImageData.stateIgnoreLoadedForReady', 'bool') -bl.type('ShapeBaseImageData.stateSequenceRandomFlash', 'bool') -bl.type('ShapeBaseImageData.stateWaitForTimeout', 'bool') -bl.type('ShapeBaseImageData.usesEnergy', 'bool') +bl.type('ShapeBaseImageData.accuFire', 'boolean') +bl.type('ShapeBaseImageData.cloakable', 'boolean') +bl.type('ShapeBaseImageData.correctMuzzleVector', 'boolean') +bl.type('ShapeBaseImageData.doColorShift', 'boolean') +bl.type('ShapeBaseImageData.emap', 'boolean') +bl.type('ShapeBaseImageData.firstPerson', 'boolean') +bl.type('ShapeBaseImageData.firstPersonParticles', 'boolean') +bl.type('ShapeBaseImageData.stateAllowImageChange', 'boolean') +bl.type('ShapeBaseImageData.stateDirection', 'boolean') +bl.type('ShapeBaseImageData.stateEjectShell', 'boolean') +bl.type('ShapeBaseImageData.stateFire', 'boolean') +bl.type('ShapeBaseImageData.stateIgnoreLoadedForReady', 'boolean') +bl.type('ShapeBaseImageData.stateSequenceRandomFlash', 'boolean') +bl.type('ShapeBaseImageData.stateWaitForTimeout', 'boolean') +bl.type('ShapeBaseImageData.usesEnergy', 'boolean') bl.type('ShapeBaseImageData::onBallTrigger:1', 'object') bl.type('SharkHoleBot::onAdd:1', 'object') bl.type('SharkHoleBot::onBotCollision:1', 'object') @@ -2701,7 +2701,7 @@ bl.type('SimObject::getVariable:1', 'object') bl.type('SimObject::onCameraEnterOrbit:1', 'object') bl.type('SimObject::onCameraLeaveOrbit:1', 'object') bl.type('SimObject::processInputEvent:1', 'object') -bl.type('SimObject::save', 'bool') +bl.type('SimObject::save', 'boolean') bl.type('SimObject::save:1', 'object') bl.type('SimObject::schedule:1', 'object') bl.type('SimObject::scheduleNoQuota:1', 'object') @@ -2719,16 +2719,16 @@ bl.type('SimSet::deleteAll:1', 'object') bl.type('SimSet::getCount:1', 'object') bl.type('SimSet::getObject', 'object') bl.type('SimSet::getObject:1', 'object') -bl.type('SimSet::isMember', 'bool') +bl.type('SimSet::isMember', 'boolean') bl.type('SimSet::isMember:1', 'object') bl.type('SimSet::listObjects:1', 'object') bl.type('SimSet::pushToBack:1', 'object') bl.type('SimSet::remove:1', 'object') bl.type('SkiItem::onUse:1', 'object') bl.type('SkiWeaponImage::onFire:1', 'object') -bl.type('Sky.noRenderBans', 'bool') -bl.type('Sky.renderBottomTexture', 'bool') -bl.type('Sky.windEffectPrecipitation', 'bool') +bl.type('Sky.noRenderBans', 'boolean') +bl.type('Sky.renderBottomTexture', 'boolean') +bl.type('Sky.windEffectPrecipitation', 'boolean') bl.type('Sky::getWindVelocity:1', 'object') bl.type('Sky::sendUpdate:1', 'object') bl.type('Sky::setWindVelocity:1', 'object') @@ -2867,29 +2867,29 @@ bl.type('Slayer_Teams_Advanced_Selector::onSelect:1', 'object') bl.type('Slayer_Teams_MovePlayerName::refreshList:1', 'object') bl.type('Slayer_Teams_Selector::onDeleteKey:1', 'object') bl.type('Slayer_Teams_Selector::onSelect:1', 'object') -bl.type('SpawnSphere.canSetIFLs', 'bool') -bl.type('StaticShape.canSetIFLs', 'bool') +bl.type('SpawnSphere.canSetIFLs', 'boolean') +bl.type('StaticShape.canSetIFLs', 'boolean') bl.type('StaticShape::explode:1', 'object') -bl.type('StaticShapeData.emap', 'bool') -bl.type('StaticShapeData.firstPersonOnly', 'bool') -bl.type('StaticShapeData.inheritEnergyFromMount', 'bool') -bl.type('StaticShapeData.isInvincible', 'bool') -bl.type('StaticShapeData.noIndividualDamage', 'bool') -bl.type('StaticShapeData.observeThroughObject', 'bool') -bl.type('StaticShapeData.renderWhenDestroyed', 'bool') -bl.type('StaticShapeData.thirdPersonOnly', 'bool') -bl.type('StaticShapeData.useEyePoint', 'bool') +bl.type('StaticShapeData.emap', 'boolean') +bl.type('StaticShapeData.firstPersonOnly', 'boolean') +bl.type('StaticShapeData.inheritEnergyFromMount', 'boolean') +bl.type('StaticShapeData.isInvincible', 'boolean') +bl.type('StaticShapeData.noIndividualDamage', 'boolean') +bl.type('StaticShapeData.observeThroughObject', 'boolean') +bl.type('StaticShapeData.renderWhenDestroyed', 'boolean') +bl.type('StaticShapeData.thirdPersonOnly', 'boolean') +bl.type('StaticShapeData.useEyePoint', 'boolean') bl.type('StaticShapeData::Damage:1', 'object') bl.type('StaticShapeData::create:1', 'object') bl.type('StaticShapeData::onAdd:1', 'object') -bl.type('SteamAPI_Init', 'bool') -bl.type('SteamEnabled', 'bool') +bl.type('SteamAPI_Init', 'boolean') +bl.type('SteamEnabled', 'boolean') bl.type('SteamGreenLightGui::ClickBack:1', 'object') bl.type('SteamGreenLightGui::clickForward:1', 'object') bl.type('SteamGreenLightGui::onRender:1', 'object') bl.type('SteamGreenLightGui::onWake:1', 'object') -bl.type('SteamSetLobbyIP', 'bool') -bl.type('SteamSetLobbyPort', 'bool') +bl.type('SteamSetLobbyIP', 'boolean') +bl.type('SteamSetLobbyPort', 'boolean') bl.type('Sun::sendUpdate:1', 'object') bl.type('TCPObject::connect:1', 'object') bl.type('TCPObject::delete:1', 'object') @@ -2898,7 +2898,7 @@ bl.type('TCPObject::listen:1', 'object') bl.type('TCPObject::saveBufferToFile:1', 'object') bl.type('TCPObject::send:1', 'object') bl.type('TCPObject::setBinary:1', 'object') -bl.type('TCPObject::setBinary:2', 'bool') +bl.type('TCPObject::setBinary:2', 'boolean') bl.type('TCPObject::setBinarySize:1', 'object') bl.type('TankShellProjectile::onCollision:1', 'object') bl.type('TankSmokeImage::onDone:1', 'object') @@ -2907,7 +2907,7 @@ bl.type('TankVehicle::Damage:1', 'object') bl.type('Trigger::getNumObjects:1', 'object') bl.type('Trigger::getObject:1', 'object') bl.type('Trigger::onAdd:1', 'object') -bl.type('Trigger::removeObjectById', 'bool') +bl.type('Trigger::removeObjectById', 'boolean') bl.type('Trigger::removeObjectById:1', 'object') bl.type('TriggerData::onAdd:1', 'object') bl.type('TriggerData::onEnterTrigger:1', 'object') @@ -2917,9 +2917,9 @@ bl.type('TrustInviteGui::ClickAccept:1', 'object') bl.type('TrustInviteGui::ClickIgnore:1', 'object') bl.type('TrustInviteGui::ClickReject:1', 'object') bl.type('TrustInviteGui::Ignore:1', 'object') -bl.type('VBOSupport', 'bool') -bl.type('Vehicle.canSetIFLs', 'bool') -bl.type('Vehicle.disableMove', 'bool') +bl.type('VBOSupport', 'boolean') +bl.type('Vehicle.canSetIFLs', 'boolean') +bl.type('Vehicle.disableMove', 'boolean') bl.type('Vehicle::finalExplosion:1', 'object') bl.type('Vehicle::lavaDamage:1', 'object') bl.type('Vehicle::onActivate:1', 'object') @@ -2929,68 +2929,68 @@ bl.type('Vehicle::onRemove:1', 'object') bl.type('Vehicle::setAngularVelocity:1', 'object') bl.type('Vehicle::teleportEffect:1', 'object') bl.type('Vehicle::tumbleCheck:1', 'object') -bl.type('VehicleData.cameraRoll', 'bool') -bl.type('VehicleData.emap', 'bool') -bl.type('VehicleData.firstPersonOnly', 'bool') -bl.type('VehicleData.inheritEnergyFromMount', 'bool') -bl.type('VehicleData.isInvincible', 'bool') -bl.type('VehicleData.observeThroughObject', 'bool') -bl.type('VehicleData.renderWhenDestroyed', 'bool') -bl.type('VehicleData.rideAble', 'bool') -bl.type('VehicleData.thirdPersonOnly', 'bool') -bl.type('VehicleData.useEyePoint', 'bool') +bl.type('VehicleData.cameraRoll', 'boolean') +bl.type('VehicleData.emap', 'boolean') +bl.type('VehicleData.firstPersonOnly', 'boolean') +bl.type('VehicleData.inheritEnergyFromMount', 'boolean') +bl.type('VehicleData.isInvincible', 'boolean') +bl.type('VehicleData.observeThroughObject', 'boolean') +bl.type('VehicleData.renderWhenDestroyed', 'boolean') +bl.type('VehicleData.rideAble', 'boolean') +bl.type('VehicleData.thirdPersonOnly', 'boolean') +bl.type('VehicleData.useEyePoint', 'boolean') bl.type('VehicleData::onCollision:1', 'object') bl.type('VehicleData::onDriverLeave:1', 'object') bl.type('VehicleData::onEnterLiquid:1', 'object') bl.type('VehicleData::onLeaveLiquid:1', 'object') -bl.type('VehicleSpawnMarker.canSetIFLs', 'bool') -bl.type('VehicleSpawnMarker.reColorVehicle', 'bool') -bl.type('VehicleSpawnMarker::getReColorVehicle', 'bool') +bl.type('VehicleSpawnMarker.canSetIFLs', 'boolean') +bl.type('VehicleSpawnMarker.reColorVehicle', 'boolean') +bl.type('VehicleSpawnMarker::getReColorVehicle', 'boolean') bl.type('VehicleSpawnMarker::getReColorVehicle:1', 'object') bl.type('VehicleSpawnMarker::getUiName:1', 'object') bl.type('VehicleSpawnMarker::onAdd:1', 'object') bl.type('VehicleSpawnMarker::onRemove:1', 'object') bl.type('VehicleSpawnMarker::setData:1', 'object') -bl.type('VehicleSpawnMarker::setData:3', 'bool') +bl.type('VehicleSpawnMarker::setData:3', 'boolean') bl.type('WandImage::onFire:1', 'object') bl.type('WandImage::onHitObject:1', 'object') bl.type('WandImage::onPreFire:1', 'object') bl.type('WandImage::onStopFire:1', 'object') bl.type('WandItem::onUse:1', 'object') -bl.type('WayPoint.canSetIFLs', 'bool') +bl.type('WayPoint.canSetIFLs', 'boolean') bl.type('Weapon::onInventory:1', 'object') bl.type('Weapon::onPickup:1', 'object') bl.type('Weapon::onUse:1', 'object') bl.type('WeaponImage::onFire:1', 'object') bl.type('WeaponImage::onMount:1', 'object') bl.type('WeaponImage::onUnMount:1', 'object') -bl.type('WheeledVehicle.canSetIFLs', 'bool') -bl.type('WheeledVehicle.disableMove', 'bool') +bl.type('WheeledVehicle.canSetIFLs', 'boolean') +bl.type('WheeledVehicle.disableMove', 'boolean') bl.type('WheeledVehicle::getWheelCount:1', 'object') -bl.type('WheeledVehicle::getWheelPowered', 'bool') +bl.type('WheeledVehicle::getWheelPowered', 'boolean') bl.type('WheeledVehicle::getWheelPowered:1', 'object') -bl.type('WheeledVehicle::setWheelPowered', 'bool') +bl.type('WheeledVehicle::setWheelPowered', 'boolean') bl.type('WheeledVehicle::setWheelPowered:1', 'object') -bl.type('WheeledVehicle::setWheelPowered:3', 'bool') -bl.type('WheeledVehicle::setWheelSpring', 'bool') +bl.type('WheeledVehicle::setWheelPowered:3', 'boolean') +bl.type('WheeledVehicle::setWheelSpring', 'boolean') bl.type('WheeledVehicle::setWheelSpring:1', 'object') -bl.type('WheeledVehicle::setWheelSteering', 'bool') +bl.type('WheeledVehicle::setWheelSteering', 'boolean') bl.type('WheeledVehicle::setWheelSteering:1', 'object') -bl.type('WheeledVehicle::setWheelTire', 'bool') +bl.type('WheeledVehicle::setWheelTire', 'boolean') bl.type('WheeledVehicle::setWheelTire:1', 'object') -bl.type('WheeledVehicleData.cameraRoll', 'bool') -bl.type('WheeledVehicleData.emap', 'bool') -bl.type('WheeledVehicleData.firstPersonOnly', 'bool') -bl.type('WheeledVehicleData.inheritEnergyFromMount', 'bool') -bl.type('WheeledVehicleData.isInvincible', 'bool') -bl.type('WheeledVehicleData.isSled', 'bool') -bl.type('WheeledVehicleData.observeThroughObject', 'bool') -bl.type('WheeledVehicleData.renderWhenDestroyed', 'bool') -bl.type('WheeledVehicleData.rideAble', 'bool') -bl.type('WheeledVehicleData.steeringUseAutoReturn', 'bool') -bl.type('WheeledVehicleData.steeringUseStrafeSteering', 'bool') -bl.type('WheeledVehicleData.thirdPersonOnly', 'bool') -bl.type('WheeledVehicleData.useEyePoint', 'bool') +bl.type('WheeledVehicleData.cameraRoll', 'boolean') +bl.type('WheeledVehicleData.emap', 'boolean') +bl.type('WheeledVehicleData.firstPersonOnly', 'boolean') +bl.type('WheeledVehicleData.inheritEnergyFromMount', 'boolean') +bl.type('WheeledVehicleData.isInvincible', 'boolean') +bl.type('WheeledVehicleData.isSled', 'boolean') +bl.type('WheeledVehicleData.observeThroughObject', 'boolean') +bl.type('WheeledVehicleData.renderWhenDestroyed', 'boolean') +bl.type('WheeledVehicleData.rideAble', 'boolean') +bl.type('WheeledVehicleData.steeringUseAutoReturn', 'boolean') +bl.type('WheeledVehicleData.steeringUseStrafeSteering', 'boolean') +bl.type('WheeledVehicleData.thirdPersonOnly', 'boolean') +bl.type('WheeledVehicleData.useEyePoint', 'boolean') bl.type('WheeledVehicleData::Damage:1', 'object') bl.type('WheeledVehicleData::create:1', 'object') bl.type('WheeledVehicleData::onAdd:1', 'object') @@ -3001,29 +3001,29 @@ bl.type('WhoTalkSO::Display:1', 'object') bl.type('WhoTalkSO::HasID:1', 'object') bl.type('WhoTalkSO::addID:1', 'object') bl.type('WhoTalkSO::removeID:1', 'object') -bl.type('WorldEditor.axisGizmoActive', 'bool') -bl.type('WorldEditor.boundingBoxCollision', 'bool') -bl.type('WorldEditor.clipToParent', 'bool') -bl.type('WorldEditor.enabled', 'bool') -bl.type('WorldEditor.isDirty', 'bool') -bl.type('WorldEditor.objectsUseBoxCenter', 'bool') -bl.type('WorldEditor.planarMovement', 'bool') -bl.type('WorldEditor.renderMissionArea', 'bool') -bl.type('WorldEditor.renderNav', 'bool') -bl.type('WorldEditor.renderObjHandle', 'bool') -bl.type('WorldEditor.renderObjText', 'bool') -bl.type('WorldEditor.renderPlane', 'bool') -bl.type('WorldEditor.renderPlaneHashes', 'bool') -bl.type('WorldEditor.renderPopupBackground', 'bool') -bl.type('WorldEditor.renderSelectionBox', 'bool') -bl.type('WorldEditor.selectionLocked', 'bool') -bl.type('WorldEditor.showMousePopupInfo', 'bool') -bl.type('WorldEditor.snapRotations', 'bool') -bl.type('WorldEditor.snapToGrid', 'bool') -bl.type('WorldEditor.toggleIgnoreList', 'bool') -bl.type('WorldEditor.visible', 'bool') +bl.type('WorldEditor.axisGizmoActive', 'boolean') +bl.type('WorldEditor.boundingBoxCollision', 'boolean') +bl.type('WorldEditor.clipToParent', 'boolean') +bl.type('WorldEditor.enabled', 'boolean') +bl.type('WorldEditor.isDirty', 'boolean') +bl.type('WorldEditor.objectsUseBoxCenter', 'boolean') +bl.type('WorldEditor.planarMovement', 'boolean') +bl.type('WorldEditor.renderMissionArea', 'boolean') +bl.type('WorldEditor.renderNav', 'boolean') +bl.type('WorldEditor.renderObjHandle', 'boolean') +bl.type('WorldEditor.renderObjText', 'boolean') +bl.type('WorldEditor.renderPlane', 'boolean') +bl.type('WorldEditor.renderPlaneHashes', 'boolean') +bl.type('WorldEditor.renderPopupBackground', 'boolean') +bl.type('WorldEditor.renderSelectionBox', 'boolean') +bl.type('WorldEditor.selectionLocked', 'boolean') +bl.type('WorldEditor.showMousePopupInfo', 'boolean') +bl.type('WorldEditor.snapRotations', 'boolean') +bl.type('WorldEditor.snapToGrid', 'boolean') +bl.type('WorldEditor.toggleIgnoreList', 'boolean') +bl.type('WorldEditor.visible', 'boolean') bl.type('WorldEditor::addUndoState:1', 'object') -bl.type('WorldEditor::canPasteSelection', 'bool') +bl.type('WorldEditor::canPasteSelection', 'boolean') bl.type('WorldEditor::canPasteSelection:1', 'object') bl.type('WorldEditor::clearIgnoreList:1', 'object') bl.type('WorldEditor::clearSelection:1', 'object') @@ -3036,10 +3036,10 @@ bl.type('WorldEditor::getSelectedObject:1', 'object') bl.type('WorldEditor::getSelectionCentroid:1', 'object') bl.type('WorldEditor::getSelectionSize:1', 'object') bl.type('WorldEditor::hideSelection:1', 'object') -bl.type('WorldEditor::hideSelection:2', 'bool') +bl.type('WorldEditor::hideSelection:2', 'boolean') bl.type('WorldEditor::ignoreObjClass:1', 'object') bl.type('WorldEditor::lockSelection:1', 'object') -bl.type('WorldEditor::lockSelection:2', 'bool') +bl.type('WorldEditor::lockSelection:2', 'boolean') bl.type('WorldEditor::pasteSelection:1', 'object') bl.type('WorldEditor::redirectConsole:1', 'object') bl.type('WorldEditor::redo:1', 'object') @@ -3060,26 +3060,26 @@ bl.type('ZombieHoleBot::onBotFollow:1', 'object') bl.type('ZombieHoleBot::onBotLoop:1', 'object') bl.type('aboutDlg::onWake:1', 'object') bl.type('aboutText::onURL:1', 'object') -bl.type('activateKeyboard', 'bool') +bl.type('activateKeyboard', 'boolean') bl.type('addBanGui::ban:1', 'object') bl.type('addBanGui::clickForever:1', 'object') bl.type('addBanGui::onSleep:1', 'object') bl.type('addBanGui::onWake:1', 'object') bl.type('addBanGui::setVictim:1', 'object') -bl.type('addCardProfile:11', 'bool') -bl.type('addCardProfile:12', 'bool') -bl.type('addCardProfile:13', 'bool') -bl.type('addCardProfile:3', 'bool') -bl.type('addCardProfile:4', 'bool') -bl.type('addCardProfile:5', 'bool') -bl.type('addCardProfile:6', 'bool') -bl.type('addCardProfile:7', 'bool') -bl.type('addCardProfile:8', 'bool') -bl.type('addCardProfile:9', 'bool') -bl.type('addMaterialMapping', 'bool') -bl.type('addOSCardProfile:3', 'bool') -bl.type('addOSCardProfile:4', 'bool') -bl.type('addOSCardProfile:5', 'bool') +bl.type('addCardProfile:11', 'boolean') +bl.type('addCardProfile:12', 'boolean') +bl.type('addCardProfile:13', 'boolean') +bl.type('addCardProfile:3', 'boolean') +bl.type('addCardProfile:4', 'boolean') +bl.type('addCardProfile:5', 'boolean') +bl.type('addCardProfile:6', 'boolean') +bl.type('addCardProfile:7', 'boolean') +bl.type('addCardProfile:8', 'boolean') +bl.type('addCardProfile:9', 'boolean') +bl.type('addMaterialMapping', 'boolean') +bl.type('addOSCardProfile:3', 'boolean') +bl.type('addOSCardProfile:4', 'boolean') +bl.type('addOSCardProfile:5', 'boolean') bl.type('adminGui::ClickClearBricks:1', 'object') bl.type('adminGui::ClickGameMode:1', 'object') bl.type('adminGui::ClickServerSettings:1', 'object') @@ -3090,10 +3090,10 @@ bl.type('adminGui::openEnvGui:1', 'object') bl.type('adminGui::sortList:1', 'object') bl.type('adminGui::sortNumList:1', 'object') bl.type('adminGui::spy:1', 'object') -bl.type('alxIsPlaying', 'bool') -bl.type('alxSetChannelVolume', 'bool') -bl.type('amIDrivingAVehicle', 'bool') -bl.type('amIStrafeSteering', 'bool') +bl.type('alxIsPlaying', 'boolean') +bl.type('alxSetChannelVolume', 'boolean') +bl.type('amIDrivingAVehicle', 'boolean') +bl.type('amIStrafeSteering', 'boolean') bl.type('ammo::onInventory:1', 'object') bl.type('authTCPobj_Client::onConnectFailed:1', 'object') bl.type('authTCPobj_Client::onConnected:1', 'object') @@ -3198,14 +3198,14 @@ bl.type('colorGui::popUp:1', 'object') bl.type('colorGui::setMode:1', 'object') bl.type('colorGui::update:1', 'object') bl.type('commandToClient:1', 'object') -bl.type('compile', 'bool') +bl.type('compile', 'boolean') bl.type('connectingGui::cancel:1', 'object') bl.type('connectingGui::onWake:1', 'object') -bl.type('containerBoxClear', 'bool') -bl.type('containerBoxEmpty', 'bool') +bl.type('containerBoxClear', 'boolean') +bl.type('containerBoxEmpty', 'boolean') bl.type('containerRayCast:4', 'object') -bl.type('createCanvas', 'bool') -bl.type('createPath', 'bool') +bl.type('createCanvas', 'boolean') +bl.type('createPath', 'boolean') bl.type('customAvatarGui::ClickX:1', 'object') bl.type('customAvatarGui::onWake:1', 'object') bl.type('customAvatar_modelSelect::onSelect:1', 'object') @@ -3218,7 +3218,7 @@ bl.type('defaultControlsGui::apply:1', 'object') bl.type('defaultControlsGui::clickClose:1', 'object') bl.type('defaultControlsGui::onSleep:1', 'object') bl.type('defaultControlsGui::onWake:1', 'object') -bl.type('discoverFile', 'bool') +bl.type('discoverFile', 'boolean') bl.type('dodgeballImage::onBallTrigger:1', 'object') bl.type('dodgeballImage::onCharge:1', 'object') bl.type('dodgeballImage::onFire:1', 'object') @@ -3226,20 +3226,20 @@ bl.type('dodgeballImage::onMount:1', 'object') bl.type('dodgeballImage::onUnMount:1', 'object') bl.type('dodgeballItem::onUse:1', 'object') bl.type('dodgeballProjectile::onCollision:1', 'object') -bl.type('doesAllowConnections', 'bool') -bl.type('dofScreenShot', 'bool') -bl.type('enableJoystick', 'bool') -bl.type('enableMouse', 'bool') -bl.type('enableWinConsole:1', 'bool') +bl.type('doesAllowConnections', 'boolean') +bl.type('dofScreenShot', 'boolean') +bl.type('enableJoystick', 'boolean') +bl.type('enableMouse', 'boolean') +bl.type('enableWinConsole:1', 'boolean') bl.type('escapeMenu::clickAdmin:1', 'object') bl.type('escapeMenu::clickLoadBricks:1', 'object') bl.type('escapeMenu::clickMinigames:1', 'object') bl.type('escapeMenu::clickSaveBricks:1', 'object') bl.type('escapeMenu::onWake:1', 'object') bl.type('escapeMenu::toggle:1', 'object') -bl.type('exec', 'bool') -bl.type('fileCopy', 'bool') -bl.type('fileDelete', 'bool') +bl.type('exec', 'boolean') +bl.type('fileCopy', 'boolean') +bl.type('fileDelete', 'boolean') bl.type('filtersGui::onSleep:1', 'object') bl.type('filtersGui::onWake:1', 'object') bl.type('flatPaintProjectile::onCollision:1', 'object') @@ -3251,9 +3251,9 @@ bl.type('footballImage::onMount:1', 'object') bl.type('footballImage::onUnMount:1', 'object') bl.type('footballProjectile::onCollision:1', 'object') bl.type('footballProjectile::onRest:1', 'object') -bl.type('fxDTSBrick.isBasePlate', 'bool') -bl.type('fxDTSBrick.isPlanted', 'bool') -bl.type('fxDTSBrick::canExplode', 'bool') +bl.type('fxDTSBrick.isBasePlate', 'boolean') +bl.type('fxDTSBrick.isPlanted', 'boolean') +bl.type('fxDTSBrick::canExplode', 'boolean') bl.type('fxDTSBrick::canExplode:1', 'object') bl.type('fxDTSBrick::colorVehicle:1', 'object') bl.type('fxDTSBrick::delete:1', 'object') @@ -3281,31 +3281,31 @@ bl.type('fxDTSBrick::getPrintID:1', 'object') bl.type('fxDTSBrick::getShapeFxID:1', 'object') bl.type('fxDTSBrick::getUpBrick', 'object') bl.type('fxDTSBrick::getUpBrick:1', 'object') -bl.type('fxDTSBrick::hasFakePathToGround', 'bool') +bl.type('fxDTSBrick::hasFakePathToGround', 'boolean') bl.type('fxDTSBrick::hasFakePathToGround:1', 'object') -bl.type('fxDTSBrick::hasPathToGround', 'bool') +bl.type('fxDTSBrick::hasPathToGround', 'boolean') bl.type('fxDTSBrick::hasPathToGround:1', 'object') -bl.type('fxDTSBrick::isBasePlate', 'bool') +bl.type('fxDTSBrick::isBasePlate', 'boolean') bl.type('fxDTSBrick::isBasePlate:1', 'object') -bl.type('fxDTSBrick::isColliding', 'bool') +bl.type('fxDTSBrick::isColliding', 'boolean') bl.type('fxDTSBrick::isColliding:1', 'object') -bl.type('fxDTSBrick::isDead', 'bool') +bl.type('fxDTSBrick::isDead', 'boolean') bl.type('fxDTSBrick::isDead:1', 'object') -bl.type('fxDTSBrick::isExposed', 'bool') +bl.type('fxDTSBrick::isExposed', 'boolean') bl.type('fxDTSBrick::isExposed:1', 'object') -bl.type('fxDTSBrick::isFakeDead', 'bool') +bl.type('fxDTSBrick::isFakeDead', 'boolean') bl.type('fxDTSBrick::isFakeDead:1', 'object') -bl.type('fxDTSBrick::isInSceneGraph', 'bool') +bl.type('fxDTSBrick::isInSceneGraph', 'boolean') bl.type('fxDTSBrick::isInSceneGraph:1', 'object') -bl.type('fxDTSBrick::isInTree', 'bool') +bl.type('fxDTSBrick::isInTree', 'boolean') bl.type('fxDTSBrick::isInTree:1', 'object') -bl.type('fxDTSBrick::isPlanted', 'bool') +bl.type('fxDTSBrick::isPlanted', 'boolean') bl.type('fxDTSBrick::isPlanted:1', 'object') -bl.type('fxDTSBrick::isRayCasting', 'bool') +bl.type('fxDTSBrick::isRayCasting', 'boolean') bl.type('fxDTSBrick::isRayCasting:1', 'object') -bl.type('fxDTSBrick::isRendering', 'bool') +bl.type('fxDTSBrick::isRendering', 'boolean') bl.type('fxDTSBrick::isRendering:1', 'object') -bl.type('fxDTSBrick::isTreeRendering', 'bool') +bl.type('fxDTSBrick::isTreeRendering', 'boolean') bl.type('fxDTSBrick::isTreeRendering:1', 'object') bl.type('fxDTSBrick::killBrick:1', 'object') bl.type('fxDTSBrick::onDeath:1', 'object') @@ -3314,40 +3314,40 @@ bl.type('fxDTSBrick::onRemove:1', 'object') bl.type('fxDTSBrick::plant:1', 'object') bl.type('fxDTSBrick::sendWrenchData:1', 'object') bl.type('fxDTSBrick::setColliding:1', 'object') -bl.type('fxDTSBrick::setColliding:2', 'bool') +bl.type('fxDTSBrick::setColliding:2', 'boolean') bl.type('fxDTSBrick::setColor:1', 'object') bl.type('fxDTSBrick::setColorFX:1', 'object') -bl.type('fxDTSBrick::setDataBlock', 'bool') +bl.type('fxDTSBrick::setDataBlock', 'boolean') bl.type('fxDTSBrick::setDataBlock:1', 'object') bl.type('fxDTSBrick::setItem:1', 'object') bl.type('fxDTSBrick::setItemPosition:1', 'object') bl.type('fxDTSBrick::setItemRespawntime:1', 'object') bl.type('fxDTSBrick::setPrint:1', 'object') bl.type('fxDTSBrick::setRayCasting:1', 'object') -bl.type('fxDTSBrick::setRayCasting:2', 'bool') +bl.type('fxDTSBrick::setRayCasting:2', 'boolean') bl.type('fxDTSBrick::setRendering:1', 'object') -bl.type('fxDTSBrick::setRendering:2', 'bool') +bl.type('fxDTSBrick::setRendering:2', 'boolean') bl.type('fxDTSBrick::setShapeFX:1', 'object') bl.type('fxDTSBrick::setTrusted:1', 'object') -bl.type('fxDTSBrick::setTrusted:2', 'bool') +bl.type('fxDTSBrick::setTrusted:2', 'boolean') bl.type('fxDTSBrick::trustCheckFinished:1', 'object') -bl.type('fxDTSBrick::willCauseChainKill', 'bool') +bl.type('fxDTSBrick::willCauseChainKill', 'boolean') bl.type('fxDTSBrick::willCauseChainKill:1', 'object') -bl.type('fxDTSBrickData.alwaysShowWireFrame', 'bool') +bl.type('fxDTSBrickData.alwaysShowWireFrame', 'boolean') bl.type('fxDTSBrickData.brickSizeX', 'object') bl.type('fxDTSBrickData.brickSizeY', 'object') bl.type('fxDTSBrickData.brickSizeZ', 'object') -bl.type('fxDTSBrickData.canCoverBottom', 'bool') -bl.type('fxDTSBrickData.canCoverEast', 'bool') -bl.type('fxDTSBrickData.canCoverNorth', 'bool') -bl.type('fxDTSBrickData.canCoverSouth', 'bool') -bl.type('fxDTSBrickData.canCoverTop', 'bool') -bl.type('fxDTSBrickData.canCoverWest', 'bool') -bl.type('fxDTSBrickData.hasPrint', 'bool') -bl.type('fxDTSBrickData.indestructable', 'bool') -bl.type('fxDTSBrickData.isWaterBrick', 'bool') +bl.type('fxDTSBrickData.canCoverBottom', 'boolean') +bl.type('fxDTSBrickData.canCoverEast', 'boolean') +bl.type('fxDTSBrickData.canCoverNorth', 'boolean') +bl.type('fxDTSBrickData.canCoverSouth', 'boolean') +bl.type('fxDTSBrickData.canCoverTop', 'boolean') +bl.type('fxDTSBrickData.canCoverWest', 'boolean') +bl.type('fxDTSBrickData.hasPrint', 'boolean') +bl.type('fxDTSBrickData.indestructable', 'boolean') +bl.type('fxDTSBrickData.isWaterBrick', 'boolean') bl.type('fxDTSBrickData::disappear:1', 'object') -bl.type('fxDTSBrickData::getBlockArrayBit', 'bool') +bl.type('fxDTSBrickData::getBlockArrayBit', 'boolean') bl.type('fxDTSBrickData::getBlockArrayBit:1', 'object') bl.type('fxDTSBrickData::getMaxSide:1', 'object') bl.type('fxDTSBrickData::getVolume:1', 'object') @@ -3367,13 +3367,13 @@ bl.type('fxDTSBrickData::onTrustCheckFinished:1', 'object') bl.type('fxDTSBrickData::onUse:1', 'object') bl.type('fxDTSBrickData::openTreasureChest:1', 'object') bl.type('fxDTSBrickData::reappear:1', 'object') -bl.type('fxDayCycle.targetUseDefaultVector', 'bool') +bl.type('fxDayCycle.targetUseDefaultVector', 'boolean') bl.type('fxDayCycle::sendUpdate:1', 'object') bl.type('fxDayCycle::setDayLength:1', 'object') bl.type('fxDayCycle::setDayOffset:1', 'object') bl.type('fxDayCycle::setEnabled:1', 'object') -bl.type('fxDayCycle::setEnabled:2', 'bool') -bl.type('fxLight.Enable', 'bool') +bl.type('fxDayCycle::setEnabled:2', 'boolean') +bl.type('fxLight.Enable', 'boolean') bl.type('fxLight::attachToBrick:1', 'object') bl.type('fxLight::attachToBrick:2', 'object') bl.type('fxLight::attachToObject:1', 'object') @@ -3384,46 +3384,46 @@ bl.type('fxLight::getTransform:1', 'object') bl.type('fxLight::onRemove:1', 'object') bl.type('fxLight::reset:1', 'object') bl.type('fxLight::setEnable:1', 'object') -bl.type('fxLight::setEnable:2', 'bool') -bl.type('fxLightData.AnimBrightness', 'bool') -bl.type('fxLightData.AnimColor', 'bool') -bl.type('fxLightData.AnimOffsets', 'bool') -bl.type('fxLightData.AnimRadius', 'bool') -bl.type('fxLightData.AnimRotation', 'bool') -bl.type('fxLightData.ConstantSizeOn', 'bool') -bl.type('fxLightData.FlareOn', 'bool') -bl.type('fxLightData.FlareTP', 'bool') -bl.type('fxLightData.LerpBrightness', 'bool') -bl.type('fxLightData.LerpColor', 'bool') -bl.type('fxLightData.LerpOffset', 'bool') -bl.type('fxLightData.LerpRadius', 'bool') -bl.type('fxLightData.LerpRotation', 'bool') -bl.type('fxLightData.LightOn', 'bool') -bl.type('fxLightData.LinkFlare', 'bool') -bl.type('fxLightData.LinkFlareSize', 'bool') -bl.type('fxLightData.SingleColorKeys', 'bool') -bl.type('fxPlane.additiveBlend', 'bool') -bl.type('fxPlane.blend', 'bool') -bl.type('fxPlane.colorMultiply', 'bool') -bl.type('fxPlane.isSolid', 'bool') +bl.type('fxLight::setEnable:2', 'boolean') +bl.type('fxLightData.AnimBrightness', 'boolean') +bl.type('fxLightData.AnimColor', 'boolean') +bl.type('fxLightData.AnimOffsets', 'boolean') +bl.type('fxLightData.AnimRadius', 'boolean') +bl.type('fxLightData.AnimRotation', 'boolean') +bl.type('fxLightData.ConstantSizeOn', 'boolean') +bl.type('fxLightData.FlareOn', 'boolean') +bl.type('fxLightData.FlareTP', 'boolean') +bl.type('fxLightData.LerpBrightness', 'boolean') +bl.type('fxLightData.LerpColor', 'boolean') +bl.type('fxLightData.LerpOffset', 'boolean') +bl.type('fxLightData.LerpRadius', 'boolean') +bl.type('fxLightData.LerpRotation', 'boolean') +bl.type('fxLightData.LightOn', 'boolean') +bl.type('fxLightData.LinkFlare', 'boolean') +bl.type('fxLightData.LinkFlareSize', 'boolean') +bl.type('fxLightData.SingleColorKeys', 'boolean') +bl.type('fxPlane.additiveBlend', 'boolean') +bl.type('fxPlane.blend', 'boolean') +bl.type('fxPlane.colorMultiply', 'boolean') +bl.type('fxPlane.isSolid', 'boolean') bl.type('fxPlane::sendUpdate:1', 'object') -bl.type('fxSunLight.AnimAzimuth', 'bool') -bl.type('fxSunLight.AnimBrightness', 'bool') -bl.type('fxSunLight.AnimColor', 'bool') -bl.type('fxSunLight.AnimElevation', 'bool') -bl.type('fxSunLight.AnimRotation', 'bool') -bl.type('fxSunLight.AnimSize', 'bool') -bl.type('fxSunLight.Enable', 'bool') -bl.type('fxSunLight.FlareTP', 'bool') -bl.type('fxSunLight.LerpAzimuth', 'bool') -bl.type('fxSunLight.LerpBrightness', 'bool') -bl.type('fxSunLight.LerpColor', 'bool') -bl.type('fxSunLight.LerpElevation', 'bool') -bl.type('fxSunLight.LerpRotation', 'bool') -bl.type('fxSunLight.LerpSize', 'bool') -bl.type('fxSunLight.LinkFlareSize', 'bool') -bl.type('fxSunLight.LockToRealSun', 'bool') -bl.type('fxSunLight.SingleColorKeys', 'bool') +bl.type('fxSunLight.AnimAzimuth', 'boolean') +bl.type('fxSunLight.AnimBrightness', 'boolean') +bl.type('fxSunLight.AnimColor', 'boolean') +bl.type('fxSunLight.AnimElevation', 'boolean') +bl.type('fxSunLight.AnimRotation', 'boolean') +bl.type('fxSunLight.AnimSize', 'boolean') +bl.type('fxSunLight.Enable', 'boolean') +bl.type('fxSunLight.FlareTP', 'boolean') +bl.type('fxSunLight.LerpAzimuth', 'boolean') +bl.type('fxSunLight.LerpBrightness', 'boolean') +bl.type('fxSunLight.LerpColor', 'boolean') +bl.type('fxSunLight.LerpElevation', 'boolean') +bl.type('fxSunLight.LerpRotation', 'boolean') +bl.type('fxSunLight.LerpSize', 'boolean') +bl.type('fxSunLight.LinkFlareSize', 'boolean') +bl.type('fxSunLight.LockToRealSun', 'boolean') +bl.type('fxSunLight.SingleColorKeys', 'boolean') bl.type('fxSunLight::reset:1', 'object') bl.type('fxSunLight::sendUpdate:1', 'object') bl.type('fxSunLight::setAzimuthKeys:1', 'object') @@ -3478,8 +3478,8 @@ bl.type('fxSunLight::setUseRotation:1', 'object') bl.type('fxSunLight::setUseSize:1', 'object') bl.type('getBrickLimit', 'object') bl.type('getCurrentQuotaObject', 'object') -bl.type('getParticleDisconnectMode', 'bool') -bl.type('glTexImage3D', 'bool') +bl.type('getParticleDisconnectMode', 'boolean') +bl.type('glTexImage3D', 'boolean') bl.type('glowPaintProjectile::onCollision:1', 'object') bl.type('greenKeyImage::onFire:1', 'object') bl.type('greenKeyImage::onHitObject:1', 'object') @@ -3518,24 +3518,24 @@ bl.type('horseSoccerBallStandImage::onBallTrigger:1', 'object') bl.type('horseSoccerBallStandImage::onFire:1', 'object') bl.type('horseSoccerBallStandImage::onMount:1', 'object') bl.type('horseSoccerBallStandImage::onUnMount:1', 'object') -bl.type('isDeviceFullScreenOnly', 'bool') -bl.type('isEventPending', 'bool') -bl.type('isFile', 'bool') -bl.type('isFullScreen', 'bool') -bl.type('isFunction', 'bool') -bl.type('isJoystickDetected', 'bool') -bl.type('isKoreanBuild', 'bool') -bl.type('isLANAddress', 'bool') -bl.type('isMacintosh', 'bool') -bl.type('isObject', 'bool') -bl.type('isPackage', 'bool') -bl.type('isUnlocked', 'bool') -bl.type('isWindows', 'bool') -bl.type('isWriteableFileName', 'bool') +bl.type('isDeviceFullScreenOnly', 'boolean') +bl.type('isEventPending', 'boolean') +bl.type('isFile', 'boolean') +bl.type('isFullScreen', 'boolean') +bl.type('isFunction', 'boolean') +bl.type('isJoystickDetected', 'boolean') +bl.type('isKoreanBuild', 'boolean') +bl.type('isLANAddress', 'boolean') +bl.type('isMacintosh', 'boolean') +bl.type('isObject', 'boolean') +bl.type('isPackage', 'boolean') +bl.type('isUnlocked', 'boolean') +bl.type('isWindows', 'boolean') +bl.type('isWriteableFileName', 'boolean') bl.type('jelloPaintProjectile::onCollision:1', 'object') bl.type('joinMiniGameGui::ClickLeave:1', 'object') bl.type('joinMiniGameGui::onWake:1', 'object') -bl.type('lockMouse:1', 'bool') +bl.type('lockMouse:1', 'boolean') bl.type('mm_Fade::OnWait:1', 'object') bl.type('mm_Fade::onDone:1', 'object') bl.type('newMessageHud::onSleep:1', 'object') @@ -3543,7 +3543,7 @@ bl.type('newMessageHud::onWake:1', 'object') bl.type('newMessageHud::open:1', 'object') bl.type('newMessageHud::updatePosition:1', 'object') bl.type('newMessageHud::updateTypePosition:1', 'object') -bl.type('nextResolution', 'bool') +bl.type('nextResolution', 'boolean') bl.type('noHudGui::onRender:1', 'object') bl.type('noHudGui::onSleep:1', 'object') bl.type('noHudGui::onWake:1', 'object') @@ -3569,14 +3569,14 @@ bl.type('optionsDlg::updateMaxViewDistance:1', 'object') bl.type('optionsDlg::updateTempBrickBlockers:1', 'object') bl.type('paintProjectile::onCollision:1', 'object') bl.type('pearlPaintProjectile::onCollision:1', 'object') -bl.type('playJournal:2', 'bool') +bl.type('playJournal:2', 'boolean') bl.type('postServerTCPObj::onConnectFailed:1', 'object') bl.type('postServerTCPObj::onConnected:1', 'object') bl.type('postServerTCPObj::onDNSFailed:1', 'object') bl.type('postServerTCPObj::onDisconnect:1', 'object') bl.type('postServerTCPObj::onLine:1', 'object') -bl.type('prevResolution', 'bool') -bl.type('protocolRegistryCheck', 'bool') +bl.type('prevResolution', 'boolean') +bl.type('protocolRegistryCheck', 'boolean') bl.type('pushBroomImage::onFire:1', 'object') bl.type('pushBroomImage::onStopFire:1', 'object') bl.type('queryMasterTCPObj::onConnectFailed:1', 'object') @@ -3590,11 +3590,11 @@ bl.type('redKeyImage::onFire:1', 'object') bl.type('redKeyImage::onHitObject:1', 'object') bl.type('redKeyImage::onPreFire:1', 'object') bl.type('redKeyImage::onStopFire:1', 'object') -bl.type('redbookClose', 'bool') -bl.type('redbookOpen', 'bool') -bl.type('redbookPlay', 'bool') -bl.type('redbookSetVolume', 'bool') -bl.type('redbookStop', 'bool') +bl.type('redbookClose', 'boolean') +bl.type('redbookOpen', 'boolean') +bl.type('redbookPlay', 'boolean') +bl.type('redbookSetVolume', 'boolean') +bl.type('redbookStop', 'boolean') bl.type('regNameGui::onClose:1', 'object') bl.type('regNameGui::onSleep:1', 'object') bl.type('regNameGui::onType:1', 'object') @@ -3607,7 +3607,7 @@ bl.type('regName_tcpObj::onDisconnect:1', 'object') bl.type('regName_tcpObj::onLine:1', 'object') bl.type('saveBricksGui::onSleep:1', 'object') bl.type('saveBricksGui::onWake:1', 'object') -bl.type('screenShot', 'bool') +bl.type('screenShot', 'boolean') bl.type('selectBLIDGui::onSleep:1', 'object') bl.type('selectBLIDGui::onWake:1', 'object') bl.type('selectBLIDGui::select:1', 'object') @@ -3616,20 +3616,20 @@ bl.type('servAuthTCPobj::onConnectFailed:1', 'object') bl.type('servAuthTCPobj::onConnected:1', 'object') bl.type('servAuthTCPobj::onDNSFailed:1', 'object') bl.type('servAuthTCPobj::onLine:1', 'object') -bl.type('serverCmdSymbolHandeler', 'bool') -bl.type('setClipboard', 'bool') +bl.type('serverCmdSymbolHandeler', 'boolean') +bl.type('setClipboard', 'boolean') bl.type('setCurrentQuotaObject:1', 'object') -bl.type('setDisplayDevice', 'bool') -bl.type('setDisplayDevice:5', 'bool') -bl.type('setEchoFileLoads:1', 'bool') +bl.type('setDisplayDevice', 'boolean') +bl.type('setDisplayDevice:5', 'boolean') +bl.type('setEchoFileLoads:1', 'boolean') bl.type('setJoinIP_tcpObj::onLine:1', 'object') -bl.type('setNetPort', 'bool') -bl.type('setRes', 'bool') -bl.type('setScreenMode', 'bool') -bl.type('setScreenMode:4', 'bool') -bl.type('setServerInfo', 'bool') -bl.type('setVerticalSync', 'bool') -bl.type('setVerticalSync:1', 'bool') +bl.type('setNetPort', 'boolean') +bl.type('setRes', 'boolean') +bl.type('setScreenMode', 'boolean') +bl.type('setScreenMode:4', 'boolean') +bl.type('setServerInfo', 'boolean') +bl.type('setVerticalSync', 'boolean') +bl.type('setVerticalSync:1', 'boolean') bl.type('skiVehicle::onAdd:1', 'object') bl.type('skiVehicle::onDriverLeave:1', 'object') bl.type('skiVehicle::onImpact:1', 'object') @@ -3653,22 +3653,22 @@ bl.type('spearImage::onCharge:1', 'object') bl.type('spearImage::onFire:1', 'object') bl.type('stablePaintProjectile::onCollision:1', 'object') bl.type('swirlPaintProjectile::onCollision:1', 'object') -bl.type('switchBitDepth', 'bool') +bl.type('switchBitDepth', 'boolean') bl.type('swordImage::onPreFire:1', 'object') bl.type('swordImage::onStopFire:1', 'object') bl.type('ti_tcp::onConnectFailed:1', 'object') bl.type('ti_tcp::onConnected:1', 'object') bl.type('ti_tcp::onDisconnect:1', 'object') bl.type('ti_tcp::onLine:1', 'object') -bl.type('toggleFullScreen', 'bool') -bl.type('trace:1', 'bool') +bl.type('toggleFullScreen', 'boolean') +bl.type('trace:1', 'boolean') bl.type('unBanGui::clickUnBan:1', 'object') bl.type('unBanGui::onSleep:1', 'object') bl.type('unBanGui::onWake:1', 'object') bl.type('unBanGui::sortList:1', 'object') bl.type('unBanGui::sortNumList:1', 'object') bl.type('unBanGui::unBan:1', 'object') -bl.type('upnpAdd', 'bool') +bl.type('upnpAdd', 'boolean') bl.type('wrenchBotDlg::LoadDataBlocks:1', 'object') bl.type('wrenchBotDlg::Respawn:1', 'object') bl.type('wrenchBotDlg::botOff:1', 'object') @@ -3694,7 +3694,8 @@ bl.type('ShapeBase::getPendingImage', 'object') bl.type('SimObject::getGroup', 'object') bl.type('containerSearchNext', 'object') bl.type('fxDTSBrick.client', 'object') -bl.type('getDataBlock', 'object') +bl.type('GameBase::getDataBlock', 'object') +bl.type('fxDTSBrick::getDataBlock', 'object') bl.type('alxPlay:1', 'object') -- Manually entered diff --git a/src/util/libbl.lua b/src/util/libbl.lua index 838594c..a903169 100644 --- a/src/util/libbl.lua +++ b/src/util/libbl.lua @@ -106,21 +106,29 @@ local function valToTs(val) error('valToTs: could not convert '..type(val), 3) end end +local function convertValFromTs(val, typ) + if typ=='boolean' then + return tsBool(val) + elseif typ=='object' then + return toTsObject(val) + else + error('valFromTs: invalid force type '..typ, 4) + end +end bl._forceType = bl._forceType or {} -local function valFromTs(val, name) +local function valFromTs(val, name, name2) -- todo: ensure name and name2 are already lowercase if type(val)~='string' then error('valFromTs: expected string, got '..type(val), 3) end if name then - local nameL = name:lower() - if bl._forceType[nameL] then - local typ = bl._forceType[nameL] - if typ=='boolean' then - return tsBool(val) - elseif typ=='object' then - return toTsObject(val) - else - error('valFromTs: invalid force type '..typ, 3) - end + name = name:lower() + if bl._forceType[name] then + return convertValFromTs(val, bl._forceType[name]) + end + end + if name2 then + name2 = name2:lower() + if bl._forceType[name2] then + return convertValFromTs(val, bl._forceType[name2]) end end -- '' -> nil @@ -151,22 +159,35 @@ end local function arglistToTs(args) return map(args, valToTs) end -function bl.type(name, typ) - if typ~='bool' and typ~='boolean' and typ~='object' and typ~=nil then - error('bl.type: can only set type to \'bool\' or \'object\' or nil', 2) end - if not isValidFuncNameNsArgn(name) then - error('bl.type: invalid function or variable name \''..name..'\'', 2) end - if typ=='bool' then typ='boolean' end - - bl._forceType[name:lower()] = typ - -- apply to children (wip) - --local class, rest = name:match('^([a-zA-Z0-9_]+)(::.+)$') - --if not class then - -- class, rest = name:match('^([a-zA-Z0-9_]+)(%..+)$') end - --if class then - -- - --end +local function classFromForceTypeStr(name) + local class, rest = name:match('^([a-zA-Z0-9_]+)(::.+)$') + if not class then + class, rest = name:match('^([a-zA-Z0-9_]+)(%..+)$') end + return class,rest end +local setForceType +setForceType = function(ftname, typ) + if typ~='boolean' and typ~='object' and typ~=nil then + error('bl.type: can only set type to \'boolean\', \'object\', or nil', 2) end + if not isValidFuncNameNsArgn(ftname) then + error('bl.type: invalid function or variable name \''..ftname..'\'', 2) end + + ftname = ftname:lower() + + bl._forceType[ftname] = typ + + -- apply to child classes if present + local cname, rest = classFromForceTypeStr(ftname) + if cname then + local meta = bl._objectUserMetas[cname] + if meta then + for chcname,_ in pairs(meta._children) do + setForceType(chcname..rest, typ) + end + end + end +end +bl.type = setForceType -- Value detection @@ -210,40 +231,47 @@ end local tsClassMeta = { __tostring = function(t) return 'torqueClass:'..t._name.. - (t._inherit and (':'..t._inherit) or '') + (t._inherit and (':'..t._inherit._name) or '') end, } bl._objectUserMetas = bl._objectUserMetas or {} -function bl.class(name, inherit) - if not ( type(name)=='string' and isValidFuncName(name) ) then +function bl.class(cname, inhname) + if not ( type(cname)=='string' and isValidFuncName(cname) ) then error('bl.class: argument #1: invalid class name', 2) end - if not ( inherit==nil or (type(inherit)=='string' and isValidFuncName(inherit)) ) then + if not ( inhname==nil or (type(inhname)=='string' and isValidFuncName(inhname)) ) then error('bl.class: argument #2: inherit name must be a string or nil', 2) end - name = name:lower() + cname = cname:lower() - local met = bl._objectUserMetas[name] or { - _name = name, + local met = bl._objectUserMetas[cname] or { + _name = cname, _inherit = nil, _children = {}, } - bl._objectUserMetas[name] = met + bl._objectUserMetas[cname] = met setmetatable(met, tsClassMeta) - if inherit then - inherit = inherit:lower() + if inhname then + inhname = inhname:lower() - local inh = bl._objectUserMetas[inherit] - if not inh then error('bl.class: argument #2: \''..inherit..'\' is not the '.. + local inh = bl._objectUserMetas[inhname] + if not inh then error('bl.class: argument #2: \''..inhname..'\' is not the '.. 'name of an existing class', 2) end - inh._children[name] = true + inh._children[cname] = true local inhI = met._inherit if inhI and inhI~=inh then error('bl.class: argument #2: class already exists and '.. 'inherits a different parent.', 2) end - met._inherit = inh + + -- apply inherited method and field types + for ftname, typ in pairs(bl._forceType) do + local cname2, rest = classFromForceTypeStr(ftname) + if cname2==inhname then + setForceType(cname..rest, typ) + end + end end end local function objectInheritedMetas(name) @@ -279,11 +307,15 @@ local tsObjectMeta = { return function(t, ...) local args = {...} local argsS = arglistToTs(args) - return valFromTs(_bllua_ts.callobj(rawget(t,'_tsObjectId'), name, unpack(argsS)), + return valFromTs( + _bllua_ts.callobj(rawget(t,'_tsObjectId'), name, unpack(argsS)), + rawget(t,'_tsName') and rawget(t,'_tsName')..'::'..name, rawget(t,'_tsNamespace')..'::'..name) end else - return valFromTs(_bllua_ts.getfield(rawget(t,'_tsObjectId'), name), + return valFromTs( + _bllua_ts.getfield(rawget(t,'_tsObjectId'), name), + rawget(t,'_tsName') and rawget(t,'_tsName')..'.'..name, rawget(t,'_tsNamespace')..'.'..name) end end @@ -489,7 +521,7 @@ local tsMeta = { -- bl.set(name, value) -- Used to set global variables function bl.set(name, val) - _bllua_ts.call('_bllua_set_var', name, valToTs(val)) + _bllua_ts.setvar(name, valToTs(val)) end -- Utility functions @@ -499,7 +531,7 @@ function bl.call(func, ...) return _bllua_ts.call(func, unpack(argsS)) end function bl.eval(code) - return valFromTs(_bllua_ts.call('eval', code)) + return valFromTs(_bllua_ts.eval(code)) end function bl.exec(file) return valFromTs(_bllua_ts.call('exec', file)) @@ -524,8 +556,13 @@ function bl.array(name, ...) local rest = {...} return name..table.concat(rest, '_') end -function _bllua_call(name, ...) - -- todo: call ts->lua using this instead of directly +function _bllua_call(fnameS, ...) + local args = arglistFromTs(fnameS:lower(), {...}) + if not _G[fnameS] then + error('luacall: no global lua function named \''..fnameS..'\'') end + -- todo: library fields and object methods + local res = _G[fnameS](args) + return valToTs(res) end -- bl.schedule: Use TS's schedule function to schedule lua calls @@ -544,7 +581,7 @@ function bl.schedule(time, cb, ...) bl._scheduleNextId = bl._scheduleNextId+1 local args = {...} local handle = tonumber(_bllua_ts.call('schedule', - time, 0, 'luacall', '_bllua_schedule_callback', id)) + time, 0, '_bllua_luacall', '_bllua_schedule_callback', id)) local sch = { callback = cb, args = args, @@ -554,8 +591,9 @@ function bl.schedule(time, cb, ...) bl._scheduleTable[id] = sch return sch end -function _bllua_schedule_callback(id) - id = tonumber(id) or error('_bllua_schedule_callback: invalid id: '..tostring(id)) +function _bllua_schedule_callback(idS) + local id = tonumber(idS) or + error('_bllua_schedule_callback: invalid id: '..tostring(idS)) local sch = bl._scheduleTable[id] if not sch then error('_bllua_schedule_callback: no schedule with id '..id) end bl._scheduleTable[id] = nil @@ -563,26 +601,48 @@ function _bllua_schedule_callback(id) end -- serverCmd and clientCmd --- bl.serverCmd('suicide', function(client) client.player:kill() end) bl._cmds = bl._cmds or {} -function _bllua_process_cmd(cmdS, clientS, ...) - local client = toTsObject(clientS) - local argsS = {...} - local args = arglistFromTs(cmdS, argsS) - local func = bl._cmds[cmdS] +function _bllua_process_cmd(cmdS, ...) + local cmd = cmdS:lower() + local args = arglistFromTs(cmd, {...}) + local func = bl._cmds[cmd] if not func then error('_bllua_process_cmd: no cmd named \''..cmd..'\'') end - pcall(func, client, unpack(args)) + func(unpack(args)) --pcall(func, unpack(args)) end local function addCmd(cmd, func) if not isValidFuncName(cmd) then error('addCmd: invalid function name \''..tostring(cmd)..'\'') end - bl._servercmds[cmd] = func - local arglist = '%a,%b,%c,%d,%e,%f,%g,%h' - _bllua_ts.eval('function '..cmd..'(%cl,'..arglist..'){'.. - 'luacall(_bllua_process_cmd,"'..cmd..'",%cl,'..arglist..');}') + bl._cmds[cmd] = func + local arglist = '%a,%b,%c,%d,%e,%f,%g,%h,%i,%j,%k,%l,%m,%n,%o,%p' + _bllua_ts.eval('function '..cmd..'('..arglist..'){'.. + '_bllua_luacall(_bllua_process_cmd,"'..cmd..'",'..arglist..');}') +end +function bl.addServerCmd(name, func) + name = name:lower() + addCmd('servercmd'..name, func) + bl._forceType['servercmd'..name..':1'] = 'object' +end +function bl.addClientCmd(name, func) + name = name:lower() + addCmd('clientcmd'..name, func) +end + +-- commandToServer and commandToClient +function bl.commandToServer(cmd, ...) + _bllua_ts.call('commandToServer', + _bllua_ts.call('addTaggedString', cmd), + unpack(arglistToTs({...}))) +end +function bl.commandToClient(cmd, ...) + _bllua_ts.call('commandToClient', + _bllua_ts.call('addTaggedString', cmd), + unpack(arglistToTs({...}))) +end +function bl.commandToAll(cmd, ...) + _bllua_ts.call('commandToAll', + _bllua_ts.call('addTaggedString', cmd), + unpack(arglistToTs({...}))) end -function bl.serverCmd(name, func) addCmd('serverCmd'..name, func) end -function bl.clientCmd(name, func) addCmd('clientCmd'..name, func) end -- Hooks (using TS packages) local function isPackageActive(pkg) @@ -603,42 +663,67 @@ local function deactivatePackage(pkg) _bllua_ts.call('deactivatePackage', pkg) end end +local hookNargs = 8 +local hookArglistLocal = '%a,%b,%c,%d,%e,%f,%g,%h' +local hookArglistGlobal = '$_bllua_hook_arg1,$_bllua_hook_arg2,$_bllua_hook_arg3,$_bllua_hook_arg4,$_bllua_hook_arg5,$_bllua_hook_arg6,$_bllua_hook_arg7,$_bllua_hook_arg8' bl._hooks = bl._hooks or {} -function _bllua_process_hook(pkgS, nameS, timeS, ...) - local argsS = {...} - local args = arglistFromTs(nameS, argsS) - +function _bllua_process_hook_before(pkgS, nameS, ...) + local args = arglistFromTs(nameS, {...}) local func = bl._hooks[pkgS] and bl._hooks[pkgS][nameS] and - bl._hooks[pkgS][nameS][timeS] + bl._hooks[pkgS][nameS].before if not func then - error('_bllua_process_hook: no hook for '..pkgS..':'..nameS..':'..timeS) end - - pcall(func, args) + error('_bllua_process_hook_before: no hook for '..pkgs..':'..nameS) end + _bllua_ts.setvar('_bllua_hook_abort', '0') + func(args) --pcall(func, args) + if args._return then + _bllua_ts.setvar('_bllua_hook_abort', '1') + _bllua_ts.setvar('_bllua_hook_return', valToTs(args._return)) + end + for i=1,hookNargs do + _bllua_ts.setvar('_bllua_hook_arg'..i, valToTs(args[i])) + end +end +function _bllua_process_hook_after(pkgS, nameS, resultS, ...) + nameS = nameS:lower() + local args = arglistFromTs(nameS, {...}) + args._return = valFromTs(resultS, nameS) + local func = bl._hooks[pkgS] and bl._hooks[pkgS][nameS] and + bl._hooks[pkgS][nameS].after + if not func then + error('_bllua_process_hook_after: no hook for '..pkgs..':'..nameS) end + func(args) --pcall(func, args) + return valToTs(args._return) end local function updateHook(pkg, name, hk) - local arglist = '%a,%b,%c,%d,%e,%f,%g,%h' local beforeCode = hk.before and - ('luacall("_bllua_process_hook", "'..pkg..'", "'..name.. - '", "before", '..arglist..');') or '' - local parentCode = hk.override and - ('luacall("_bllua_process_hook", "'..pkg..'", "'..name.. - '", "override", '..arglist..');') or - (tsIsFunctionNsname(name) and - ('parent::'..name:match('[^:]+$')..'('..arglist..');') or '') + ('_bllua_luacall("_bllua_process_hook_before", "'..pkg..'","'..name.. + '",'..hookArglistLocal..');') or '' + local arglist = (hk.before and hookArglistGlobal or hookArglistLocal) + local parentCode = + tsIsFunctionNsname(name) and -- only call parent if it exists + (hk.before and + 'if($_bllua_hook_abort)return $_bllua_hook_return; else ' or '').. + ((hk.after and '%result=' or 'return ').. + 'parent::'..name:match('[^:]+$').. + '('..arglist..');') or '' local afterCode = hk.after and - ('luacall("_bllua_process_hook", "'..pkg..'", "'..name.. - '", "after", '..arglist..');') or '' - bl.eval('package '..pkg..'{function '..name..'('..arglist..'){'.. - beforeCode..parentCode..afterCode..'}};') + ('return _bllua_luacall("_bllua_process_hook_after","'..pkg..'","'..name..'",%result,'.. + arglist..');') or '' + local code = + 'package '..pkg..'{'.. + 'function '..name..'('..hookArglistLocal..'){'.. + beforeCode..parentCode..afterCode.. + '}'.. + '};' + _bllua_ts.eval(code) end function bl.hook(pkg, name, time, func) if not isValidFuncName(pkg) then error('bl.hook: argument #1: invalid package name \''..tostring(pkg)..'\'', 2) end if not isValidFuncNameNs(name) then error('bl.hook: argument #2: invalid function name \''..tostring(name)..'\'', 2) end - if time~='before' and time~='after' and time~='override' then - error('bl.hook: argument #3: time must be one of '.. - '\'before\' \'after\' \'override\'', 2) end + if time~='before' and time~='after' then + error('bl.hook: argument #3: time must be \'before\' or \'after\'', 2) end if type(func)~='function' then error('bl.hook: argument #4: expected a function', 2) end @@ -654,9 +739,8 @@ function bl.unhook(pkg, name, time) error('bl.unhook: argument #1: invalid package name \''..tostring(pkg)..'\'', 2) end if not isValidFuncNameNs(name) then error('bl.unhook: argument #2: invalid function name \''..tostring(name)..'\'', 2) end - if time~='before' and time~='after' and time~='override' then - error('bl.unhook: argument #3: time must be one of '.. - '\'before\' \'after\' \'override\'', 2) end + if time~='before' and time~='after' then + error('bl.unhook: argument #3: time must be \'before\' or \'after\'', 2) end if not name then if bl._hooks[pkg] then @@ -679,15 +763,16 @@ function bl.unhook(pkg, name, time) end updateHook(pkg, name, {}) else - if time~='before' and time~='after' and time~='override' then - error('bl.unhook: argument #3: time must be nil or one of '.. - '\'before\' \'after\' \'override\'', 2) end + if time~='before' and time~='after' then + error('bl.unhook: argument #3: time must be nil, \'before\', or \'after\'', 2) end bl._hooks[pkg][name][time] = nil if table.empty(bl._hooks[pkg][name]) and table.empty(bl._hooks[pkg]) then bl._hooks[pkg] = nil deactivatePackage(pkg) + updateHook(pkg, name, {}) + else + updateHook(pkg, name, bl._hooks[pkg][name]) end - updateHook(pkg, name, bl._hooks[pkg][name]) end else --error('bl.unhook: no hooks registered for function \''..name.. diff --git a/src/util/libts.lua b/src/util/libts-lua.lua similarity index 97% rename from src/util/libts.lua rename to src/util/libts-lua.lua index 3ed7f8b..96ef5fc 100644 --- a/src/util/libts.lua +++ b/src/util/libts-lua.lua @@ -213,4 +213,8 @@ function _bllua_smarteval(code) end end -_bllua_ts.call('echo', ' Executed libts.lua') +function ts.setvar(name, val) + _bllua_ts.call('_bllua_set_var', name, val) +end + +_bllua_ts.call('echo', ' Executed libts-lua.lua') diff --git a/src/util/libts-support.cs b/src/util/libts-ts.cs similarity index 72% rename from src/util/libts-support.cs rename to src/util/libts-ts.cs index c928408..292c40e 100644 --- a/src/util/libts-support.cs +++ b/src/util/libts-ts.cs @@ -49,4 +49,26 @@ function _bllua_set_var(%name, %val) { return ""; } -echo(" Executed libts-support.cs"); +// Public Lua library for TS +function luacall(%func, %a,%b,%c,%d,%e,%f,%g,%h,%i,%j,%k,%l,%m,%n,%o,%p) { + if($_bllua_active) + return _bllua_luacall("_bllua_call", %func, %a,%b,%c,%d,%e,%f,%g,%h,%i,%j,%k,%l,%m,%n,%o,%p); +} +function luaexec(%fn) { + if($_bllua_active) + return _bllua_luacall("_bllua_exec", %fn); +} +function luaeval(%code) { + if($_bllua_active) + return _bllua_luacall("_bllua_eval", %code); +} +function luaget(%name) { + if($_bllua_active) + return _bllua_luacall("_bllua_getvar", %name); +} +function luaset(%name, %val) { + if($_bllua_active) + _bllua_luacall("_bllua_setvar", %name, %val); +} + +echo(" Executed libts-ts.cs"); From 1a4c7bfefc63027a4d6ad78d8ca9b4d4be4d2fc7 Mon Sep 17 00:00:00 2001 From: Redo Date: Sat, 4 Oct 2025 01:44:25 -0500 Subject: [PATCH 4/4] improve readme, improve std lib --- BlockLua.dll | Bin 374823 -> 374823 bytes compile.bat | 8 +-- readme.md | 145 ++++++++++++++++++++++++++++++-------------- src/util/libbl.lua | 22 +++++-- src/util/std.lua | 23 ++----- src/util/vector.lua | 6 +- 6 files changed, 129 insertions(+), 75 deletions(-) diff --git a/BlockLua.dll b/BlockLua.dll index 68f65ae06770b81e774aaa1e409fe2ce6a992c66..962b4c36051ea8f2f51ad4d30783660b1c4d17f6 100644 GIT binary patch delta 7055 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 X)WA)i+lcQWSzEE|NgKC~3y=6elcqSa delta 6988 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

0`Mm;y4k8e#3H+B*Nmvaf?MH*0Q7*#j#N8%4tao z)VXp^q}8&_jl0NU`h-5*d)W7WA8rZ3;2C|nO9XR@eK;pSe6aS9=E9vMl`Q-k#fiD? z_?ijb|f)Kq7FNfBqX;HAXLt6!-v)}ITug9hF|1dxVI|s?^$a=9M63v zN)NQ=0DlE{!YMsaSh}bPH-@>>)rAgLj^wG0I5GC2rCWTJToB#2I5jsCw*=5mf+h`@ zDT)n(*c2`V#%Q_7vF0G5KK+%(FzYbcFJecs4+(@gl3FC!dXV!-s^DWS?q{s!J1rMS z$N=!vbK%OGF#GIi_OzGqVHxh2s~E|38xeI4egNd^xv$7!7@ok@2__s?CUFBmm&oNi z9UdSoMnx_5_Q1~^-8h8|VWbgejK;AT*@|RIUzsC1fap#5Cmq)wxnsixY`EHke1YUy5AqmEroyq8 zdvCn&dXNYtRZ7PgJrZxNBbkaMxkBfNvJo+QM^cJpXAe?^WO$-u%swO&M>&!cNX92S zlFLX=j}}PxfgKeE>{#wkd~fa?i>JPCsy%?7`aiJCydH$}WSG5O#C{^KLE1Rn=TwLr z&xH?6pJFeYk&&@rzR75qj9+JjQ*7^%3gzRuXQH*a*84ds4%61;+Jk86L?l-h*@?Z| zTBv^+yXo?*-L$V_5a1^$np-$k8<6b6Z(ZFa3`t85;*I22@Sez}jD2Bi5FVb5*wDV% zUXzaE29ikyj^r+q<@hwsD;4+$uxMIh4-#!ep!Q@CJNCuZUk|9W( zOC5<4NjiR@?5;Bc$-m3(#J(ar>-6b^{0?pwzRKZ>mBrg0V|7ElXZ7+ju z(>MeCl*;83v(RYnY77+`zn_E;soG`2{U4N(TU=l$U>F3paoDTY!m7#mq-g6Ina?2j zTVxw-oq~T7e3lDO1RtoLitZ?zJBqq_@MId7FEZJf3D!)WV>GjLe7D{Oyq&R|p@)xyP@SaL^&wWMpt z;!G@Anl%;9rQxogfqzo-E%cg&W(P#i!bf{7Oq$EZgU@Vk3{eSsJJm^o?vsvsjG(tT zX!kkDQw6?}>Y0LenTvWJ)hqA^r8PC1fv8Z>tEn!t>YejYt`zWVR96c6In`!CFEgOt zCFtL&#$O7VnE9}PIx-Q}3c4r@^=U!3Q{5owg88VM1^tNXRzWYy=FFnoYlJ`Wg$p^i zoeMZUWar?U*5Bx7gR%P&BNic>xALHR>UPil8keK zYx#KK{*HUWfyLZ5QJ;0fQSD<%E8zY?M6v4yKh`p-kh@PrD=V$11X2q)7m;~GSL%G+ zm4`)K9&W;nVm#ElO=Mq#&CR9aK)ll_4RsJQY#w|s)ma0=!wNn*ViYk36 zsx4GCQ}riR@={beWvKR1^#xV#WvCL$QI%2k0af>?>bDG4YB{RaRDFsHUyl8j;TZib zYnE}t*WnhmfovVV_Npv@tfQ|$?GU{IgHi!D;1b^j-%9ir!m3IxUgS~ BlockLua.dll.dump.txt -@rem objdump -d BlockLua-Unsafe.dll > BlockLua-Unsafe.dll.dump.txt +@rem g++ -DBLLUA_UNSAFE src/bllua4.cpp %buildargs% -o BlockLua-Unsafe.dll @echo off +rem objdump -d BlockLua.dll > BlockLua.dll.dump.txt +rem objdump -d BlockLua-Unsafe.dll > BlockLua-Unsafe.dll.dump.txt + pause diff --git a/readme.md b/readme.md index 3d1e5d7..a3005e1 100644 --- a/readme.md +++ b/readme.md @@ -37,39 +37,45 @@ Lua scripting for Blockland `object[index]` - Access a member of a Torque set or group `for childIndex, child in object:members() do` - Iterate objects within of a Torque set or group. Indices start at 0 like in Torque. -### Advanced +### Timing/Schedules `sched = bl.schedule(timeMs, function, args...)` - Schedule a Lua function to be called later, similar to schedule in Torque `sched:cancel()` - Cancel a previously scheduled timer ### Raycasts and Searches -`hitObject, hitPos, hitNormal = bl.raycast(vector{startPosX,y,z}, vector{endPosX,y,z}, 'objtype'/{'objtypes',...}, ignoreObjects...?)` - Cast a ray in the world over objects of the specified type(s) (possibly excluding some objects), and return the object hit, the position of the hit, and the normal vector to the surface hit. See the Types section for a list of valid object types. +`hitObject, hitPos, hitNormal = bl.raycast(vector{startPosX,y,z}, vector{endPosX,y,z}, 'objtype'/{'objtypes',...}, ignoreObjects...?)` - Cast a ray in the world over objects of the specified type(s) (possibly excluding some objects), and return the object hit, the position of the hit, and the normal vector to the surface hit. See the Types section for a list of valid object types. `for object in bl.boxSearch(vector{centerX,y,z}, vector{sizeX,y,z}, 'objtype'/{'objtypes',...}) do` - Find all objects in the world of the specified type(s) whose bounding box overlaps with the specified box. See the Types section for a list of valid object types. `for object in bl.radiusSearch(vector{centerX,y,z}, radius, 'objtype'/{'objtypes',...}) do` - Find all objects of the specified type(s) whose bounding box overlaps with the specified sphere. See the Types section for a list of valid object types. ### Server-Client Communication -`bl.addServerCmd('commandName', function(client, args...) code() end)` - Register a /-command on the server -`bl.addClientCmd('commandName', function(args...) code() end)` - Register a client command on the client +`bl.addServerCmd('commandName', function(client, args...) yourCode end)` - Register a /command on the server +`bl.addClientCmd('commandName', function(args...) yourCode end)` - Register a client command on the client `bl.commandToServer('commandName', args...)` - Execute a server command as a client -`bl.commandToClient('commandName', args...)` - As the server, execute a client command on a specific client +`bl.commandToClient('commandName', args...)` - As the server, execute a client command on a specific client `bl.commandToAll('commandName', args...)` - As the server, execute a client command on all clients ### Packages/Hooks -`bl.hook('packageName', 'functionName', 'before'/'after', function(args) code() end)` - Hook a Torque function with a Lua function. +`bl.hook('packageName', 'functionName', 'before'/'after', function(args) yourCode end)` - Hook a Torque function with a Lua function. `args` is an array containing the arguments provided to the function. If the hook is `before`, these can be modified before being passed to the parent function. If `args._return` is set to anything other than nil by a `before` hook, the parent function will not be called, and the function will simply return that value. Also in this case, any `after` hook will not be executed. In an `after` hook, `args._return` is set to the value returned by the parent function, and can be modified. `bl.unhook('packageName', 'functionName', 'before'/'after')` - Remove a previously defined hook -`bl.unhook('packageName', 'functionName')` - Remove any previously defined hooks on the function within the package +`bl.unhook('packageName', 'functionName')` - Remove any previously defined hooks on the function within the package `bl.unhook('packageName')` - Remove any previously defined hooks within the package -### Classes and Types -`bl.type('varName', 'type')` - Register the type of a Torque global variable, for conversion when accessing from Lua. Valid types are 'boolean', 'object', and nil (default is nil, which applies automatic conversion). -`bl.type('funcName', 'type')` - Register the return type of a Torque function, for conversion when calling from Lua. Valid types are 'bool', 'object', and nil - all other conversion is automatic. Already done for all default functions. -`bl.type('className::funcName', 'type')` - Register the return type of a Torque object method. -`bl.class('className')` - Register a Torque class to be used from Lua (Already done for all built-in classes) -`bl.class('className', 'parentClassName')` - Same as above, with inheritance -`bl.bool(thing)` - Manually convert a Torque boolean (0 or 1) into a Lua boolean. -`bl.object(thing)` - Manually convert a Torque object reference (object ID or name) into a Lua object. +### Modules and Dependencies +`dofile('Add-Ons/Path/file.lua')` - Execute a Lua file. Relative paths (`./file.lua`) are allowed. `..` is not allowed. + +`require('modulePath.moduleName')` - Load a Lua file or external library. +`require` replaces `.` with `/` in the path, and then searches for files in the following order: +- `./modulePath/moduleName.lua` +- `./modulePath/moduleName/init.lua` +- `modulePath/moduleName.lua` (Relative to game directory) +- `modulePath/moduleName/init.lua` (Relative to game directory) +- `modules/lualib/modulePath/moduleName.lua` +- `modules/lualib/modulePath/moduleName/init.lua` +- `modules/lualib/modulePath/moduleName.dll` - C libraries for Lua can be loaded + +Like in standard Lua, modules loaded using `require` are only executed the first time `require` is called with that path (from anywhere). Subsequent calls simply return the result from the initial execution. To allow hot reloading, use `dofile`. ### File I/O Lua's builtin file I/O is emulated, and is confined to the same directories as TorqueScript file I/O. @@ -81,27 +87,78 @@ Relative paths (`./`) are allowed. `..` is not allowed. Reading files from ZIPs is supported, with caveats. Null characters are not allowed, and \r\n becomes \n. Generally, text formats work, and binary formats don't. When reading from outside ZIPs, binary files are fully supported. -### Modules and Dependencies -`dofile('Add-Ons/Path/file.lua')` - Execute a Lua file. Relative paths (`./file.lua`) are allowed. `..` is not allowed. - -`require('modulePath.moduleName')` - Load a Lua file or or external library. -Require replaces `.` with `/` in the path, and then searches for files in the following order: -- `./modulePath/moduleName.lua` -- `./modulePath/moduleName/init.lua` -- `modulePath/moduleName.lua` (Relative to game directory) -- `modulePath/moduleName/init.lua` (Relative to game directory) -- `modules/lualib/modulePath/moduleName.lua` -- `modules/lualib/modulePath/moduleName/init.lua` -- `modules/lualib/modulePath/moduleName.dll` - -Like in standard Lua, modules loaded using `require` are only executed the first time `require` is called with that path. Subsequent calls simply return the result from the initial execution. To allow hot reloading, use `dofile`. +### Object Creation +`bl.new('className')` - Create a new Torque object +`bl.new('className', {fieldName = value, ...})` - Create a new Torque object with the given fields +`bl.new('className objectName', fields?)` - Create a new named Torque object +`bl.new('className objectName:parentName', fields?)` - Create a new named Torque object with inheritance +`bl.datablock('datablockClassName datablockName', fields?)` - Create a new datablock +`bl.datablock('datablockClassName datablockName:parentDatablockName', fields?)` - Create a new datablock with inheritance -### TBD -- bl.class -- bl.new -- bl.datablock -- vector -- Extended standard library functions +### Classes and Types +`bl.type('varName', 'type')` - Register the type of a Torque global variable, for conversion when accessing from Lua. Valid types are 'boolean', 'object', and nil (default is nil, which applies automatic conversion). +`bl.type('funcName', 'type')` - Register the return type of a Torque function, for conversion when calling from Lua. Valid types are 'bool', 'object', and nil - all other conversion is automatic. Already done for all default functions. +`bl.type('className::funcName', 'type')` - Register the return type of a Torque object method. +`bl.class('className')` - Register an existing Torque class to be used from Lua. Already done for all built-in classes. +`bl.class('className', 'parentClassName')` - Same as above, with inheritance +`bl.boolean(thing)` - Manually convert a Torque boolean (0 or 1) into a Lua boolean. +`bl.object(thing)` - Manually convert a Torque object reference (object ID or name) into a Lua object. + +### Vectors +`vec = vector{x,y,z}` - Create a vector. Can have any number of elements +`vec1 + vec2` - Add +`vec1 - vec2` - Subtract +`vec * number` - Scale (x\*n, y\*n, z\*n) +`vec / number` - Scale (x/n, y/n, z/n) +`vec ^ number` - Exponentiate (x^n, y^n, z^n) +`vec1 * vec2` - Multiply elements piecewise (x1\*x2, y1\*y2, z1\*z2) +`vec1 / vec2` - Divide elements piecewise (x1/x2, y1/y2, z1/z2) +`vec1 ^ vec2` - Exponentiate elements piecewise (x1^x2, y1^y2, z1^z2) +`-vec` - Negate/invert +`vec1 == vec2` - Compare by value +`vec:length()` - Length +`vec:normalize()` - Preserve direction but scale so magnitude is 1 +`vec:floor()` - Floor each element +`vec:ceil()` - Ceil each element +`vec:abs()` - Absolute value each element +`vec1:dot(vec2)` - Dot product +`vec1:cross(vec2)` - Cross product (Only defined for two vectors of length 3) +`vec:rotateZ(radians)` - Rotate counterclockwise about the Z (vertical) axis +`vec:rotateByAngleId(0/1/2/3)` - Rotate counterclockwise about the Z (vertical) axis in increments of 90 degrees +`vec:tsString()` - Convert to string usable by Torque. Done automatically when a vector is passed to Torque. +`vec1:distance(vec2)` - Distance between two points +`vec2 = vec:copy()` - Clone a vector so its elements can be modified without affecting the original. Usually not needed - the builtin vector functions never modify vectors in-place. + +### Extended Standard Lua Library +`string[index]` +`string[{start,stop}]` +`string.split(str, separator='' (splits into chars), noregex=false)` +`string.bytes(str)` +`string.trim(str, charsToTrim=' \t\r\n')` +`table.empty` +`table.map(func, ...)` +`table.map_list(func, ...)` +`table.swap(tbl)` +`table.reverse(list)` +`table.islist(list)` +`table.append(list, ...)` +`table.join(...)` +`table.contains(tbl, val)` +`table.contains_list(list, val)` +`table.copy(tbl)` +`table.copy_list(list)` +`table.sortcopy(tbl, sortFunction?)` +`table.removevalue(tbl, val)` +`table.removevalue_list(tbl, val)` +`table.tostring(tbl)` +`for char in string.chars(str) do` +`string.escape(str, escapes={['\n']='\\n', etc. (C standard)})` +`string.unescape(str, escapeChar='\\', unescapes={['\\n']='\n', etc.})` +`io.readall(filename)` +`io.writeall(filename, str)` +`math.round(num)` +`math.mod(divisor, modulus)` +`math.clamp(num, min, max)` ## Type Conversion When a TorqueScript function is called from Lua or vice-versa, the arguments and return value must be converted between the two languages' type systems. @@ -125,17 +182,17 @@ TorqueScript stores no type information; all values in TorqueScript are strings. All Lua code is sandboxed, and file access is confied to the default directories in the same way TorqueScript is. BlockLua also has access to any C libraries installed in the `modules/lualib` folder, so be careful throwing things in there. ### Unsafe Mode -BlockLua-Unsafe.dll can be used in place of BlockLua.dll, to remove the sandboxing of Lua code. This allows Lua code to access any file and use any library, including ffi. +BlockLua-Unsafe.dll can be built and used in place of BlockLua.dll (see compile.bat), to remove the sandboxing of Lua code. This allows Lua code to access any file and use any library, including ffi. Please do not publish add-ons that require unsafe mode. ## Other Reference ### List of Object Types -'all' - Any object -'brick' - Bricks with Ray-Casting enabled -'brickalways' - All bricks including those with Ray-Casting disabled -'player' - Players or bots -'item' - Items -'vehicle' - Vehicles -'projectile' - Projectiles -Other types: 'static', 'environment', 'terrain', 'water', 'trigger', 'marker', 'gamebase', 'shapebase', 'camera', 'staticshape', 'vehicleblocker', 'explosion', 'corpse', 'debris', 'physicalzone', 'staticts', 'staticrendered', 'damagableitem' +`'all'` - Any object +`'player'` - Players or bots +`'item'` - Items +`'vehicle'` - Vehicles +`'projectile'` - Projectiles +`'brick'` - Bricks with raycasting enabled +`'brickalways'` - All bricks including those with raycasting disabled +Other types: `'static'`, `'environment'`, `'terrain'`, `'water'`, `'trigger'`, `'marker'`, `'gamebase'`, `'shapebase'`, `'camera'`, `'staticshape'`, `'vehicleblocker'`, `'explosion'`, `'corpse'`, `'debris'`, `'physicalzone'`, `'staticts'`, `'staticrendered'`, `'damagableitem'` diff --git a/src/util/libbl.lua b/src/util/libbl.lua index a903169..62ea1a6 100644 --- a/src/util/libbl.lua +++ b/src/util/libbl.lua @@ -536,7 +536,7 @@ end function bl.exec(file) return valFromTs(_bllua_ts.call('exec', file)) end -function bl.tobool(val) +function bl.boolean(val) return val~=nil and val~=false and --val~='' and @@ -734,6 +734,9 @@ function bl.hook(pkg, name, time, func) updateHook(pkg, name, bl._hooks[pkg][name]) activatePackage(pkg) end +local function tableEmpty(t) + return next(t)~=nil +end function bl.unhook(pkg, name, time) if not isValidFuncName(pkg) then error('bl.unhook: argument #1: invalid package name \''..tostring(pkg)..'\'', 2) end @@ -766,7 +769,7 @@ function bl.unhook(pkg, name, time) if time~='before' and time~='after' then error('bl.unhook: argument #3: time must be nil, \'before\', or \'after\'', 2) end bl._hooks[pkg][name][time] = nil - if table.empty(bl._hooks[pkg][name]) and table.empty(bl._hooks[pkg]) then + if tableEmpty(bl._hooks[pkg][name]) and tableEmpty(bl._hooks[pkg]) then bl._hooks[pkg] = nil deactivatePackage(pkg) updateHook(pkg, name, {}) @@ -871,10 +874,15 @@ function bl.radiusSearch(pos, radius, mask) end -- Print/Talk/Echo +local maxTsArgLen = 8192 local function valsToString(vals) local strs = {} for i,v in ipairs(vals) do - strs[i] = table.tostring(v) + local tstr = table.tostring(v) + if #tstr>maxTsArgLen then + tstr = tostring(v) + end + strs[i] = tstr end return table.concat(strs, ' ') end @@ -889,11 +897,12 @@ bl.talk = function(...) _bllua_ts.call('talk', str) end +-- bl.new and bl.datablock local function createTsObj(keyword, class, name, inherit, props) local propsT = {} for k,v in pairs(props) do if not isValidFuncName(k) then - error('bl.new/datablock: invalid property name \''..k..'\'') end + error('bl.new/bl.datablock: invalid property name \''..k..'\'') end table.insert(propsT, k..'="'..valToTs(v)..'";') end @@ -903,7 +912,7 @@ local function createTsObj(keyword, class, name, inherit, props) table.concat(propsT)..'};') local obj = toTsObject(objS) if not obj then - error('bl.new/datablock: failed to create object', 3) end + error('bl.new/bl.datablock: failed to create object', 3) end return obj end @@ -926,7 +935,7 @@ local function parseTsDecl(decl) isValidFuncName(class) and (name==nil or isValidFuncName(name)) and (inherit==nil or isValidFuncName(inherit)) ) then - error('bl.new/datablock: invalid decl \''..decl..'\'\n'.. + error('bl.new/bl.datablock: invalid decl \''..decl..'\'\n'.. 'must be of the format: \'className\', \'className name\', '.. '\'className :inherit\', or \'className name:inherit\'', 3) end return class, name, inherit @@ -937,6 +946,7 @@ function bl.new(decl, props) end function bl.datablock(decl, props) local class, name, inherit = parseTsDecl(decl) + if not name then error('bl.datablock: must specify a name', 2) end return createTsObj('datablock', class, name, inherit, props) end diff --git a/src/util/std.lua b/src/util/std.lua index 23ddaf5..f1041cf 100644 --- a/src/util/std.lua +++ b/src/util/std.lua @@ -5,8 +5,7 @@ -- Table / List -- Whether a table contains no keys function table.empty(t) - for _,_ in pairs(t) do return false end - return true + return next(t)~=nil end -- Apply a function to each key in a table function table.map(f, ...) @@ -41,18 +40,6 @@ function table.reverse(l) for i=1,#l do m[#l-i+1] = l[i] end return m end --- Convert i->v to v->true -function table.values(l) - local u = {} - for _,v in ipairs(l) do u[v] = true end - return u -end --- Make a list of keys -function table.keys(t) - local u = {} - for k,_ in pairs(t) do table.insert(u, k) end - return u -end -- Whether a table is a list/array (has only monotonic integer keys) function table.islist(t) local n = 0 @@ -244,8 +231,8 @@ function string.bytes(s) end -- Trim leading and trailing whitespace function string.trim(s, ws) - ws = ws or '[ \t\r\t]' - return s:gsub('^'..ws..'+', ''):gsub(ws..'+$', '')..'' + ws = ws or ' \t\r\n' + return s:gsub('^['..ws..']+', ''):gsub('['..ws..']+$', '')..'' end -- String slicing and searching using [] operator local str_meta = getmetatable('') @@ -325,7 +312,7 @@ end io = io or {} -- Read entire file at once, return nil,err if access failed -function io.readfile(filename) +function io.readall(filename) local fi,err = io.open(filename, 'rb') if not fi then return nil,err end local s = fi:read("*a") @@ -333,7 +320,7 @@ function io.readfile(filename) return s end -- Write data to file all at once, return true if success / false,err if failure -function io.writefile(filename, data) +function io.writeall(filename, data) local fi,err = io.open(filename, 'wb') if not fi then return false,err end fi:write(data) diff --git a/src/util/vector.lua b/src/util/vector.lua index ec242b4..f166719 100644 --- a/src/util/vector.lua +++ b/src/util/vector.lua @@ -127,7 +127,7 @@ local vector_meta = { for i = 1, len do table.insert(st, tostring(v1[i])) end - return '{ '..table.concat(st, ', ')..' }' + return 'vector{ '..table.concat(st, ', ')..' }' end, unpack = function(v1) return unpack(v1) end, floor = vector_opn0n('floor', function(x1) return math.floor(x1) end), @@ -162,10 +162,10 @@ local vector_meta = { else error('vector rotateByAngleId: invalid rotation '..r, 2) end return v2 end, - rotate2d = function(v, r) + rotateZ = function(v, r) --vector_check(v, 2, 'rotate2d') if type(r)~='number' then - error('vector rotate2d: invalid rotation '..tostring(r), 2) end + error('vector rotateZ: invalid rotation '..tostring(r), 2) end local len = math.sqrt(v[1]^2 + v[2]^2) local ang = math.atan2(v[2], v[1]) + r local v2 = vector_new{ math.cos(ang)*len, math.sin(ang)*len }