function GetActionEntry(%file,%responseNumber) { %entry=""; while(!%file.isEOF()) { %ln=%file.readLine(); %tag = getword(%ln,0); if ( !strcmp(%tag,"<"@%responseNumber@">") ) { %entry= getwords(%ln,1,99); break; } } return %entry; } function GetAction(%responseFile,%queryNumber,%responseNumber) { %file = new FileObject(); if(isFile($Pref::Server::AITPath@%responseFile@".rsp") && %file.openForRead($Pref::Server::AITPath@%responseFile@".rsp")) { for(%i=0;%i<%queryNumber;%i++) { %response=GetActionEntry(%file,%responseNumber); if(%file.isEOF()) return ""; } } %file.close(); %file.delete(); return %response; } function AITMessageClient(%client,%sender,%npcFile,%queryNumber) { %senderName=%sender.getshapename(); %Mugshot=%sender.AITMugshot; %playerName=%client.player.getshapename(); %sender.AITBusy=true; %sender.AITTalkingTo=%client; %sender.setAimObject(%client.player); commandToClient(%client,'AITMessage',%sender,%senderName,%Mugshot,%npcFile,%queryNumber,%playerName); CheckAITStatus(%client,%sender); } function serverCmdAITAnswer(%client,%sender,%queryNumber,%responseNumber) { trace(1); if(%client==%sender.AITTalkingTo) { %npcFile=%sender.AITScript; %response=GetAction(%npcFile,%queryNumber,%responseNumber); if(%response!$="") { %ParamStart=strPos(%response,"(")+1; %ParamEnd=strPos(%response,")")-%ParamStart; %Param=getSubStr(%response,%ParamStart,%ParamEnd); %response=getSubStr(%response,0,%ParamStart-1); if(%Param!$="") { eval(%response@"("@%Param@","@%client@","@%sender@",\""@%npcFile@"\");"); } else { eval(%response@"("@%client@","@%sender@",\""@%npcFile@"\");"); } } else { echo("ERROR::Invalid Query/Answer!!\nnpcFile = "@%npcFile@"\nQueryNumber = "@%queryNumber); } } trace(0); } function serverCmdAITContact(%client) { %player = %client.player; %eye = %player.getEyeVector(); %vec = vectorScale(%eye, 5); %start = %player.getEyeTransform(); %end = VectorAdd(%start,%vec); while(!%ai.aiPlayer) { %hit = ContainerRayCast (%start, %end, $TypeMasks::PlayerObjectType, %player); %ai = GetWord(%hit,0); if(!%ai.aiPlayer) %player = %player SPC %found; } while(%ai != 0 ) { if(%ai.aiPlayer && %ai.AITScript!$="") { if(!%ai.AITBusy) { AITMessageClient(%client, %ai, %ai.AITScript,%ai.AITStartQuery); //start dialog. return; } else { if(IsAITBusy(%ai)) { if(%client!=%ai.AITTalkingTo) { messageClient(%client, '', %ai.AITBusyText, %ai.AITTalkingTo.player.getShapeName()); return; } else { return; } } else { AITMessageClient(%client, %ai, %ai.AITScript,%ai.AITStartQuery); //start dialog. return; } } } } } function IsAITBusy(%AiPlayerID) { InitContainerRadiusSearch(%AiPlayerID.getTransform(), 3, $TypeMasks::PlayerObjectType); %rayCastBusyCheck=ContainerSearchNext(); while(%rayCastBusyCheck != 0 ) { if(%rayCastBusyCheck==(%AiPlayerID.AITTalkingTo).player) { return(true); } %rayCastBusyCheck=ContainerSearchNext(); } return(false); } function CheckAITStatus(%Client,%Sender) // Checks if the player has moved since he started the dialog // moving too far from the sender will cancel the dialog { InitContainerRadiusSearch(%Sender.getTransform(), 2, $TypeMasks::PlayerObjectType); %rayCast=ContainerSearchNext(); while(%rayCast != 0 ) { if(%rayCast==%Client.player) { schedule(1000,0,"CheckAITStatus",%Client,%Sender); return; } %rayCast=ContainerSearchNext(); } CommandToClient(%client,'CloseAIT'); %Sender.AITBusy=false; %Sender.AITTalkingTo=0; %Sender.clearAim(); } function SpawnAI(%Name,%Script,%Mugshot,%startQuery,%location) { %player = new AIPlayer() { dataBlock = LightMaleHumanArmor; aiPlayer = true; AITScript = %Script; AITMugshot = %Mugshot; AITStartQuery = %startQuery; AITBusy = false; AITBusyText = 'Sorry but I\'m busy talking to %1 right now.'; AITTalkingTo = 0; }; MissionCleanup.add(%player); // Player setup %player.setMoveSpeed(8); %player.setTransform(%location); %player.setEnergyLevel(60); %player.setShapeName(%Name); return %player; } function TestAIT() { %player = new AIPlayer() { dataBlock = LightMaleHumanArmor; aiPlayer = true; AITScript = "elf"; AITMugshot = "elf.png"; AITStartQuery = 1; AITBusy = false; AITBusyText = 'Sorry but I\'m busy talking to %1 right now.'; AITTalkingTo = 0; }; MissionCleanup.add(%player); // Player setup %player.setMoveSpeed(8); %player.setTransform(pickSpawnPoint()); %player.setEnergyLevel(60); %player.setShapeName(%player); return %player; }