added spawning

Tile test tool now spawns classes and data
Test avoidance added to aicontroller and ainavigation
This commit is contained in:
marauder2k7 2025-07-27 12:43:19 +01:00
parent a5e969a8fd
commit f730d0bf1c
8 changed files with 286 additions and 301 deletions

View file

@ -279,22 +279,14 @@ $guiContent = new GuiNavEditorCtrl(NavEditorGui, EditorGuiGroup) {
HorizSizing = "width";
VertSizing = "bottom";
Position = "4 24";
Extent = "202 85";
Extent = "202 136";
Docking = "Top";
Margin = "3 3 3 3";
internalName = "ActionsBox";
new GuiTextCtrl(){
Profile = "EditorTextProfile";
HorizSizing = "right";
VertSizing = "bottom";
Position = "5 0";
Extent = "86 18";
text = "Actions";
};
new GuiPopUpMenuCtrl(DrawModeSelector) {
position = "155 0";
extent = "189 20";
position = "7 0";
extent = "190 20";
profile = "ToolsGuiPopUpMenuProfile";
tooltipProfile = "GuiToolTipProfile";
};
@ -436,15 +428,46 @@ $guiContent = new GuiNavEditorCtrl(NavEditorGui, EditorGuiGroup) {
internalName = "TestActions";
position = "7 21";
extent = "190 64";
new GuiButtonCtrl() {
Profile = "ToolsGuiButtonProfile";
buttonType = "PushButton";
HorizSizing = "right";
VertSizing = "bottom";
Extent = "180 18";
text = "Spawn";
command = "NavEditorGui.spawnPlayer();";
new GuiControl() {
profile = "GuiDefaultProfile";
Extent = "190 20";
new GuiTextCtrl(){
Profile = "EditorTextProfile";
extent = "89 20";
text = "Spawn Class";
};
new GuiTextCtrl(){
Profile = "EditorTextProfile";
Position = "100 0";
extent = "89 20";
text = "Spawn Datablock";
};
};
new GuiControl() {
profile = "GuiDefaultProfile";
Extent = "190 20";
new GuiPopUpMenuCtrl(SpawnClassSelector) {
extent = "89 20";
profile = "ToolsGuiPopUpMenuProfile";
tooltipProfile = "GuiToolTipProfile";
};
new GuiPopUpMenuCtrl(SpawnDatablockSelector) {
position = "100 0";
extent = "89 20";
profile = "ToolsGuiPopUpMenuProfile";
tooltipProfile = "GuiToolTipProfile";
};
};
new GuiControl() {
profile = "GuiDefaultProfile";
Extent = "190 20";
new GuiTextCtrl(){
Profile = "EditorTextProfile";
extent = "89 20";
text = "AI Actions";
};
};
new GuiControl() {
profile = "GuiDefaultProfile";
@ -457,7 +480,9 @@ $guiContent = new GuiNavEditorCtrl(NavEditorGui, EditorGuiGroup) {
VertSizing = "bottom";
Extent = "90 18";
text = "Delete";
command = "NavEditorGui.getPlayer().delete();";
tooltipProfile = "GuiToolTipProfile";
tooltip = "Delete Selected.";
command = "NavMeshTools->TestTool.getPlayer().delete();NavInspector.inspect();";
};
new GuiButtonCtrl() {
position = "100 0";
@ -467,7 +492,7 @@ $guiContent = new GuiNavEditorCtrl(NavEditorGui, EditorGuiGroup) {
VertSizing = "bottom";
Extent = "90 18";
text = "Find cover";
command = "NavEditorGui.findCover();";
command = "NavMeshTools->TestTool.findCover();";
};
};
new GuiControl() {
@ -481,7 +506,7 @@ $guiContent = new GuiNavEditorCtrl(NavEditorGui, EditorGuiGroup) {
VertSizing = "bottom";
Extent = "90 18";
text = "Follow";
command = "NavEditorGui.followObject();";
command = "NavMeshTools->TestTool.followObject();";
};
new GuiButtonCtrl() {
position = "100 0";
@ -491,7 +516,7 @@ $guiContent = new GuiNavEditorCtrl(NavEditorGui, EditorGuiGroup) {
VertSizing = "bottom";
Extent = "90 18";
text = "Stop";
command = "NavEditorGui.stop();";
command = "NavMeshTools->TestTool.stop();";
};
};
};
@ -836,153 +861,6 @@ $guiContent = new GuiNavEditorCtrl(NavEditorGui, EditorGuiGroup) {
tooltipProfile = "GuiToolTipProfile";
toolTip = "Object to follow.";
};
new GuiTextCtrl() {
text = "Movement";
profile = "ToolsGuiTextProfile";
extent = "180 20";
minExtent = "8 2";
visible = "1";
};
new GuiCheckBoxCtrl() {
internalName = "LinkWalkFlag";
class = "NavMeshTestFlagButton";
text = " Walk";
buttonType = "ToggleButton";
useMouseEvents = "0";
extent = "159 15";
minExtent = "8 2";
horizSizing = "right";
vertSizing = "bottom";
profile = "ToolsGuiCheckBoxProfile";
visible = "1";
active = "0";
tooltipProfile = "GuiToolTipProfile";
toolTip = "Can this character walk on ground?";
hovertime = "1000";
isContainer = "0";
canSave = "1";
canSaveDynamicFields = "0";
};
new GuiCheckBoxCtrl() {
internalName = "LinkSwimFlag";
class = "NavMeshTestFlagButton";
text = " Swim";
buttonType = "ToggleButton";
useMouseEvents = "0";
extent = "159 15";
minExtent = "8 2";
horizSizing = "right";
vertSizing = "bottom";
profile = "ToolsGuiCheckBoxProfile";
visible = "1";
active = "0";
tooltipProfile = "GuiToolTipProfile";
toolTip = "Can this character swim?";
hovertime = "1000";
isContainer = "0";
canSave = "1";
canSaveDynamicFields = "0";
};
new GuiCheckBoxCtrl() {
internalName = "LinkJumpFlag";
class = "NavMeshTestFlagButton";
text = " Jump";
buttonType = "ToggleButton";
useMouseEvents = "0";
extent = "159 15";
minExtent = "8 2";
horizSizing = "right";
vertSizing = "bottom";
profile = "ToolsGuiCheckBoxProfile";
visible = "1";
active = "0";
tooltipProfile = "GuiToolTipProfile";
toolTip = "Can this character jump?";
hovertime = "1000";
isContainer = "0";
canSave = "1";
canSaveDynamicFields = "0";
};
new GuiCheckBoxCtrl() {
internalName = "LinkDropFlag";
class = "NavMeshTestFlagButton";
text = " Drop";
buttonType = "ToggleButton";
useMouseEvents = "0";
extent = "159 15";
minExtent = "8 2";
horizSizing = "right";
vertSizing = "bottom";
profile = "ToolsGuiCheckBoxProfile";
visible = "1";
active = "0";
tooltipProfile = "GuiToolTipProfile";
toolTip = "Can this character drop over edges?";
hovertime = "1000";
isContainer = "0";
canSave = "1";
canSaveDynamicFields = "0";
};
new GuiCheckBoxCtrl() {
internalName = "LinkLedgeFlag";
class = "NavMeshTestFlagButton";
text = " Ledge";
buttonType = "ToggleButton";
useMouseEvents = "0";
extent = "159 15";
minExtent = "8 2";
horizSizing = "right";
vertSizing = "bottom";
profile = "ToolsGuiCheckBoxProfile";
visible = "1";
active = "0";
tooltipProfile = "GuiToolTipProfile";
toolTip = "Can this character jump from ledges?";
hovertime = "1000";
isContainer = "0";
canSave = "1";
canSaveDynamicFields = "0";
};
new GuiCheckBoxCtrl() {
internalName = "LinkClimbFlag";
class = "NavMeshTestFlagButton";
text = " Climb";
buttonType = "ToggleButton";
useMouseEvents = "0";
extent = "159 15";
minExtent = "8 2";
horizSizing = "right";
vertSizing = "bottom";
profile = "ToolsGuiCheckBoxProfile";
visible = "1";
active = "0";
tooltipProfile = "GuiToolTipProfile";
toolTip = "Can this character climb?";
hovertime = "1000";
isContainer = "0";
canSave = "1";
canSaveDynamicFields = "0";
};
new GuiCheckBoxCtrl() {
internalName = "LinkTeleportFlag";
class = "NavMeshTestFlagButton";
text = " Teleport";
buttonType = "ToggleButton";
useMouseEvents = "0";
extent = "159 15";
minExtent = "8 2";
horizSizing = "right";
vertSizing = "bottom";
profile = "ToolsGuiCheckBoxProfile";
visible = "1";
active = "0";
tooltipProfile = "GuiToolTipProfile";
toolTip = "Can this character teleport?";
hovertime = "1000";
isContainer = "0";
canSave = "1";
canSaveDynamicFields = "0";
};
};
};
new GuiMLTextCtrl(NavFieldInfoControl) {

View file

@ -428,7 +428,18 @@ function NavMeshTestTool::onActivated(%this)
%properties->TestProperties.setVisible(false);
%actions->TestActions.setVisible(true);
%properties->TestProperties.setVisible(true);
%properties->TestProperties.setVisible(false);
%classList = enumerateConsoleClasses("Player") TAB enumerateConsoleClasses("Vehicle");
echo(%classList);
SpawnClassSelector.clear();
foreach$(%class in %classList)
{
SpawnClassSelector.add(%class);
}
SpawnClassSelector.setFirstSelected(true);
}
function NavMeshTestTool::onDeactivated(%this)
@ -448,103 +459,109 @@ function NavMeshTestTool::onDeactivated(%this)
%properties->TestProperties.setVisible(false);
}
function updateTestData(%control, %flags)
function NavMeshTestTool::onPlayerSelected(%this)
{
%control->LinkWalkFlag.setActive(true);
%control->LinkSwimFlag.setActive(true);
%control->LinkJumpFlag.setActive(true);
%control->LinkDropFlag.setActive(true);
%control->LinkLedgeFlag.setActive(true);
%control->LinkClimbFlag.setActive(true);
%control->LinkTeleportFlag.setActive(true);
%control->LinkWalkFlag.setStateOn(%flags & $Nav::WalkFlag);
%control->LinkSwimFlag.setStateOn(%flags & $Nav::SwimFlag);
%control->LinkJumpFlag.setStateOn(%flags & $Nav::JumpFlag);
%control->LinkDropFlag.setStateOn(%flags & $Nav::DropFlag);
%control->LinkLedgeFlag.setStateOn(%flags & $Nav::LedgeFlag);
%control->LinkClimbFlag.setStateOn(%flags & $Nav::ClimbFlag);
%control->LinkTeleportFlag.setStateOn(%flags & $Nav::TeleportFlag);
}
function getTestFlags(%control)
{
return (%control->LinkWalkFlag.isStateOn() ? $Nav::WalkFlag : 0) |
(%control->LinkSwimFlag.isStateOn() ? $Nav::SwimFlag : 0) |
(%control->LinkJumpFlag.isStateOn() ? $Nav::JumpFlag : 0) |
(%control->LinkDropFlag.isStateOn() ? $Nav::DropFlag : 0) |
(%control->LinkLedgeFlag.isStateOn() ? $Nav::LedgeFlag : 0) |
(%control->LinkClimbFlag.isStateOn() ? $Nav::ClimbFlag : 0) |
(%control->LinkTeleportFlag.isStateOn() ? $Nav::TeleportFlag : 0);
}
function disableTestData(%control)
{
%control->LinkWalkFlag.setActive(false);
%control->LinkSwimFlag.setActive(false);
%control->LinkJumpFlag.setActive(false);
%control->LinkDropFlag.setActive(false);
%control->LinkLedgeFlag.setActive(false);
%control->LinkClimbFlag.setActive(false);
%control->LinkTeleportFlag.setActive(false);
}
function getControllerDataFlags(%controllerData)
{
return (%controllerData.allowWalk ? $Nav::WalkFlag : 0 ) |
(%controllerData.allowSwim ? $Nav::SwimFlag : 0 ) |
(%controllerData.allowJump ? $Nav::JumpFlag : 0 ) |
(%controllerData.allowDrop ? $Nav::DropFlag : 0 ) |
(%controllerData.allowLedge ? $Nav::LedgeFlag : 0) |
(%controllerData.allowClimb ? $Nav::ClimbFlag : 0) |
(%controllerData.allowTeleport ? $Nav::TeleportFlag : 0 );
}
function NavMeshTestTool::updateTestFlags(%this)
{
if(isObject(%this.getPlayer()))
{
%properties = NavEditorOptionsWindow-->TestProperties;
%player = %this.getPlayer();
%controllerData = %player.getDatablock().aiControllerData;
%controllerData.allowWalk = %properties->LinkWalkFlag.isStateOn();
%controllerData.allowSwim = %properties->LinkSwimFlag.isStateOn();
%controllerData.allowJump = %properties->LinkJumpFlag.isStateOn();
%controllerData.allowDrop = %properties->LinkDropFlag.isStateOn();
%controllerData.allowLedge = %properties->LinkLedgeFlag.isStateOn();
%controllerData.allowClimb = %properties->LinkClimbFlag.isStateOn();
%controllerData.allowTeleport = %properties->LinkTeleportFlag.isStateOn();
%player.aiController = new AIController(){ ControllerData = %controllerData; };
%player.setAIController(%player.aiController);
}
}
function NavMeshTestTool::onPlayerSelected(%this, %flags)
{
if (!isObject(%this.getPlayer().aiController) || (isObject(%this.getPlayer().aiController) && !(%this.getPlayer().isMemberOfClass("AIPlayer"))))
if (!isObject(%this.getPlayer().aiController))
{
%this.getPlayer().aiController = new AIController(){ ControllerData = %this.getPlayer().getDatablock().aiControllerData; };
%this.getPlayer().setAIController(%this.getPlayer().aiController);
%flags = getControllerDataFlags(%this.getPlayer().getDatablock().aiControllerData);
}
if(%this.getPlayer().isMemberOfClass("AIPlayer"))
{
NavInspector.inspect(%this.getPlayer());
NavInspector.setVisible(true);
}
else
{
NavInspector.inspect(%this.getPlayer().getDatablock().aiControllerData);
NavInspector.setVisible(true);
}
NavMeshIgnore(%this.getPlayer(), true);
%this.getPlayer().setDamageState("Enabled");
updateTestData(NavEditorOptionsWindow-->TestProperties, %flags);
}
function NavMeshTestTool::onPlayerDeselected(%this)
{
disableTestData(NavEditorOptionsWindow-->TestProperties);
NavInspector.inspect();
}
function NavMeshTestFlagButton::onClick(%this)
function NavMeshTestTool::stop(%this)
{
NavMeshTools->TestTool.updateTestFlags();
if (isObject(%this.getPlayer().aiController))
%this.getPlayer().aiController.stop();
else
{
%this.getPlayer().stop();
}
}
function SpawnClassSelector::onSelect(%this, %id)
{
%className = %this.getTextById(%id);
NavMeshTools->TestTool.setSpawnClass(%className);
SpawnDatablockSelector.clear();
%classData = %className @ "Data";
if(%className $= "AIPlayer")
{
%classData = "PlayerData";
}
// add the datablocks
for(%i = 0; %i < DataBlockGroup.getCount(); %i++)
{
%obj = DataBlockGroup.getObject(%i);
if( isMemberOfClass( %obj.getClassName(), %classData ))
SpawnDatablockSelector.add(%obj.getName());
}
SpawnDatablockSelector.setFirstSelected(true);
}
function SpawnDatablockSelector::onSelect(%this, %id)
{
%className = %this.getTextById(%id);
NavMeshTools->TestTool.setSpawnDatablock(%className);
}
// function NavEditorGui::findCover(%this)
// {
// if(%this.getMode() $= "TestMode" && isObject(%this.getPlayer()))
// {
// %pos = LocalClientConnection.getControlObject().getPosition();
// %text = NavEditorOptionsWindow-->TestProperties->CoverPosition.getText();
// if(%text !$= "")
// %pos = eval("return " @ %text);
// %this.getPlayer().getAIController().findCover(%pos, NavEditorOptionsWindow-->TestProperties->CoverRadius.getText());
// }
// }
// function NavEditorGui::followObject(%this)
// {
// if(%this.getMode() $= "TestMode" && isObject(%this.getPlayer()))
// {
// %obj = LocalClientConnection.player;
// %text = NavEditorOptionsWindow-->TestProperties->FollowObject.getText();
// if(%text !$= "")
// {
// %command = "return " @ %text;
// if(!endsWith(%command, ";"))
// %command = %command @ ";";
// %obj = eval(%command);
// if(!isObject(%obj))
// toolsMessageBoxOk("Error", "Cannot find object" SPC %text);
// }
// if(isObject(%obj))
// %this.getPlayer().getAIController().followObject(%obj, NavEditorOptionsWindow-->TestProperties->FollowRadius.getText());
// }
// }
//------------------------------------------------------
function TileTool::onActivated(%this)
@ -721,48 +738,6 @@ function NavEditorGui::deleteCoverPoints(%this)
}
}
function NavEditorGui::findCover(%this)
{
if(%this.getMode() $= "TestMode" && isObject(%this.getPlayer()))
{
%pos = LocalClientConnection.getControlObject().getPosition();
%text = NavEditorOptionsWindow-->TestProperties->CoverPosition.getText();
if(%text !$= "")
%pos = eval("return " @ %text);
%this.getPlayer().getAIController().findCover(%pos, NavEditorOptionsWindow-->TestProperties->CoverRadius.getText());
}
}
function NavEditorGui::followObject(%this)
{
if(%this.getMode() $= "TestMode" && isObject(%this.getPlayer()))
{
%obj = LocalClientConnection.player;
%text = NavEditorOptionsWindow-->TestProperties->FollowObject.getText();
if(%text !$= "")
{
%command = "return " @ %text;
if(!endsWith(%command, ";"))
%command = %command @ ";";
%obj = eval(%command);
if(!isObject(%obj))
toolsMessageBoxOk("Error", "Cannot find object" SPC %text);
}
if(isObject(%obj))
%this.getPlayer().getAIController().followObject(%obj, NavEditorOptionsWindow-->TestProperties->FollowRadius.getText());
}
}
function NavEditorGui::stop(%this)
{
if (isObject(%this.getPlayer().aiController))
%this.getPlayer().aiController.stop();
else
{
NavEditorGui.getPlayer().stop();
}
}
function NavInspector::inspect(%this, %obj)
{
%name = "";