USING "rage_builtins.sch" USING "globals.sch" using "script_player.sch" USING "commands_camera.sch" USING "commands_script.sch" USING "net_include.sch" using "Usefulcommands.sch" #if IS_DEBUG_BUILD // =========================================== CONSTS ============================================== CONST_INT MAX_RESOURCES 20 CONST_INT MAX_VECTORS 30 CONST_INT MAX_INTS 60 CONST_INT MAX_FLOATS 30 CONST_INT MAX_BOOLS 30 CONST_INT MAX_TEXT_WIDGETS 10 CONST_INT MAX_MODELS 10 // ===================================================== xml hash coees ================================ CONST_INT HASH_menuType 1958669326 CONST_INT HASH_subType 253941193 CONST_INT HASH_startV -1811416473 CONST_INT HASH_startF -1347571282 CONST_INT HASH_startI -1527866320 CONST_INT HASH_startB -55587979 CONST_INT HASH_startTw -2043871425 CONST_INT HASH_startMod 99217238 CONST_INT HASH_vX 2049010486 CONST_INT HASH_vY 199626429 CONST_INT HASH_vZ 461352432 CONST_INT HASH_f 1208324078 CONST_INT HASH_i 1573272431 CONST_INT HASH_b 14385563 CONST_INT HASH_mod -1905913153 CONST_INT HASH_tw -211853340 // ============================================ SET UP RESOURCES ================================== STRUCT strResourceStarts int startV int startF int startI int startB int startTw int startMod ENDSTRUCT STRUCT strResource int menuType int type WIDGET_GROUP_ID widget strResourceStarts varStart ENDSTRUCT strResource resource[MAX_RESOURCES] vector v[MAX_VECTORS] int i[MAX_INTS] float f[MAX_FLOATS] bool b[MAX_BOOLS] TEXT_WIDGET_ID tw[MAX_TEXT_WIDGETS] MODEL_NAMES mod[MAX_MODELS] // ==================================================== bools ================================ bool bExit bool bDebug bool bAddResource bool bJustCounting bool bAddToScenario bool bAddTrigger bool bPlayScenario bool bPlaybackTriggered bool bSaveData bool bLoadData //================================================== ints ======================================= int iResourceCount int vCount,fCount,iCount,bCount,twCount,modCount int iCamTime, itemp, itempb // ===================================================== floats =================================== // ======================================================= vectors ============================= vector vTemp, vTempb // ================================================= WIDGETS =================================== WIDGET_GROUP_ID parentWidget WIDGET_GROUP_ID resourceWidget WIDGET_GROUP_ID scenarioWidget WIDGET_GROUP_ID TriggerWidget //========================================== camera ================================== CAMERA_INDEX aCam, bCam // ========================================== strings ========================================= string sVehRecording STRING sfilename = "sceneBuild" // =========================================== text labels ========================================== TEXT_LABEL_31 tempTl // ============================================= vehicle index ================================= vehicle_index tempVeh // ============================================= ped_index ===================================== ped_index tempPed // ==================================================== model names ================================ MODEL_NAMES tempModel //================================================ object index ===================================== object_index tempObj //SAVE / LOAD string path="X:/GTA5/build/dev/" TEXT_LABEL_63 filename proc saveString(string s,string saveAtt) TEXT_LABEL_31 tx = "" tx += saveAtt tx += "=\"" tx += s tx += "\" " SAVE_STRING_TO_NAMED_DEBUG_FILE(tx,path,filename) ENDPROC proc saveBool(bool bBool,string saveAtt) TEXT_LABEL_31 tx = "" tx += saveAtt tx += "=\"" IF bBool = TRUE tx += "TRUE" ELSE tx += "FALSE" ENDIF tx += "\" " SAVE_STRING_TO_NAMED_DEBUG_FILE(tx,path,filename) ENDPROC PROC saveInt(int j,string saveAtt)//,bool ignoreComma=FALSE) TEXT_LABEL_31 tx = "" tx += saveAtt tx += "=\"" tx += j tx += "\" " SAVE_STRING_TO_NAMED_DEBUG_FILE(tx,path,filename) ENDPROC proc saveFloat(float fl,string saveAtt)//,bool ignoreComma=FALSE) fl=fl TEXT_LABEL_31 tx = "" tx += saveAtt tx += "=\"" SAVE_STRING_TO_NAMED_DEBUG_FILE(tx,path,filename) SAVE_FLOAT_TO_NAMED_DEBUG_FILE(fl,path,filename) SAVE_STRING_TO_NAMED_DEBUG_FILE("\" ",path,filename) ENDPROC proc saveResourceData(int j) SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) ENDPROC proc checkSaveData() if bSaveData=TRUE bSaveData=FALSE int j filename = sfilename filename += ".xml" CLEAR_NAMED_DEBUG_FILE(path,filename) // OPEN_NAMED_DEBUG_FILE(path, filename) PRINTLN(path,filename) SAVE_STRING_TO_NAMED_DEBUG_FILE("",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) PRINTLN("path: ",path," filename: ",filename) if not IS_PED_INJURED(PLAYER_PED_ID()) vTemp = GET_ENTITY_COORDS(PLAYER_PED_ID()) SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) ENDIF for j = 0 to iResourceCount-1 saveResourceData(j) ENDFOR SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) for j = 0 to resource[iResourceCount].varStart.startV-1 SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) ENDFOR SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) for j = 0 to resource[iResourceCount].varStart.startF-1 SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) ENDFOR SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) for j = 0 to resource[iResourceCount].varStart.startI-1 SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) ENDFOR SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) for j = 0 to resource[iResourceCount].varStart.startB-1 SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) ENDFOR SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) for j = 0 to resource[iResourceCount].varStart.startMod-1 SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) ENDFOR SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) PRINTLN("Saving text widget data") for j = 0 to resource[iResourceCount].varStart.startTw-1 SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) ENDFOR SAVE_STRING_TO_NAMED_DEBUG_FILE(" ",path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(path,filename) SAVE_STRING_TO_NAMED_DEBUG_FILE("",path,filename) CLOSE_DEBUG_FILE() ENDIF ENDPROC func int FIND_NTH_RESOURCE_ENTRY(int nthEntry, int menutype, int subtype=-1) int iCounter,j //PRINTLN("Find entry: nthEntry: ",nthEntry," menutype: ",menutype," subtype: ",subtype) for j = 0 to COUNT_OF(resource)-1 // PRINTLN("resource: ",j) // PRINTLN("menu type: ",resource[j].menuType) // PRINTLN("sub type: ",resource[j].type) if resource[j].menuType = menutype if subtype != -1 if resource[j].type = subtype if nthEntry = iCounter return j ENDIF iCounter++ ENDIF ELSE if nthEntry = iCounter return j ENDIF iCounter++ ENDIF ENDIF ENDFOR return -1 ENDFUNC proc getBezCoord(int resEntry, int line, float t, vector &vReturn) //vector v0, vector v1, vector v2, vector v3, float t) //outputDebugVector("v0:",bez1.vPos) //outputDebugVector("v1:",bez2.vPos) vector v0,v1,v2,v3,vR int istartVectorEntry = resource[resEntry].varStart.startV if not are_vectors_equal(v[istartVectorEntry+(line*3)],v[istartVectorEntry+(line*3)+3]) v0 = v[istartVectorEntry+(line*3)] v1 = v[istartVectorEntry+(line*3)] + v[istartVectorEntry+(line*3)+1] //bezVcontrol[bezNode] v2 = v[istartVectorEntry+(line*3)+3] - v[istartVectorEntry+(line*3)+4] v3 = v[istartVectorEntry+(line*3)+3] vR.x = (((1-t)*(1-t)*(1-t))*v0.x) + (3*((1-t)*(1-t))*t*v1.x) + (3*(1-t)*(t*t)*v2.x) + ((t*t*t)*v3.x) vR.y = (((1-t)*(1-t)*(1-t))*v0.y) + (3*((1-t)*(1-t))*t*v1.y) + (3*(1-t)*(t*t)*v2.y) + ((t*t*t)*v3.y) vR.z = (((1-t)*(1-t)*(1-t))*v0.z) + (3*((1-t)*(1-t))*t*v1.z) + (3*(1-t)*(t*t)*v2.z) + ((t*t*t)*v3.z) vReturn = vR ELSE vReturn = v[resEntry+(line*3)] ENDIF endproc proc getBezRot(int resEntry, int line, float t, vector &vReturn) vector v0,v1,vchange if not are_vectors_equal(v[resEntry+(line*3)+2],v[resEntry+(line*3)+5]) v0 = v[resEntry+(line*3)+2] v1 = v[resEntry+(line*3)+5] vChange = v1-v0 if vChange.x < -180.0 vChange.x += 360.0 ENDIF if vChange.x > 180.0 vChange.x -= 360.0 ENDIF if vChange.y < -180.0 vChange.y += 360.0 ENDIF if vChange.y > 180.0 vChange.y -= 360.0 ENDIF if vChange.z < -180.0 vChange.z += 360.0 ENDIF if vChange.z > 180.0 vChange.z -= 360.0 ENDIF vreturn = v0 + (t*vChange) endif ENDPROC proc useBezier(int bezNo, int currentTime, int totalTime, vector &vPos, vector &vRot) int iResEntry = FIND_NTH_RESOURCE_ENTRY(bezNo,0,5) //bezier resource entry float fPropOfTotalTime = to_float(currentTime) / to_float(totalTime) int iBezStart = floor(fPropOfTotalTime * (i[resource[iResEntry].varStart.startI+1]-1)) //no of nodes float timeAlongLineSegment = (fPropOfTotalTime * (i[resource[iResEntry].varStart.startI+1]-1)) - to_float(iBezStart) getBezCoord(iResEntry,iBezStart,timeAlongLineSegment,vPos) getBezRot(iResEntry,iBezStart,timeAlongLineSegment,vRot) ENDPROC func bool GET_MODEL_FOR_PED(MODEL_NAMES &aModel, string sModel) int j string aString while GET_PED_MODEL_FROM_INDEX(j,amodel) aString = GET_MODEL_NAME_FOR_DEBUG(amodel) if not Is_String_Null_Or_Empty(aString) if not Is_String_Null_Or_Empty(sModel) if ARE_STRINGS_EQUAL(aString,sModel) return true ENDIF ENDIF ENDIF j++ ENDWHILE aModel = DUMMY_MODEL_FOR_SCRIPT return FALSE ENDFUNC func bool set_model_for_Vehicle(MODEL_NAMES &setmod,string sModel) int j MODEL_NAMES modReturn while GET_VEHICLE_MODEL_FROM_INDEX(j,modReturn) if are_Strings_equal(GET_MODEL_NAME_FOR_DEBUG(modReturn),sModel) setmod = modReturn return true ENDIF j++ endwhile return FALSE ENDFUNC func vehicle_index eventToVeh(int iEvent) //coun through events finding vehicle from index stored in iEvent if iEvent != -1 return INT_TO_NATIVE(vehicle_index,i[resource[iEvent].varStart.startI+1]) ENDIF return null ENDFUNC func ped_index eventToPed(int iEvent) //coun through events finding vehicle from index stored in iEvent if iEvent != -1 return INT_TO_NATIVE(ped_index,i[resource[iEvent].varStart.startI+1]) ENDIF return null ENDFUNC proc VehToEvent(vehicle_index veh, int iTrigger) i[resource[iTrigger].varStart.startI+1] = NATIVE_TO_INT(veh) ENDPROC func string GET_RESOURCE_NAME(int MainType, int entry, int subType=-1, STRING name=NULL ) string sReturn TEXT_LABEL_31 txt txt = name txt += " " int iTriggerCount int j for j = 0 to entry if j = entry txt += iTriggerCount sReturn = GET_STRING_FROM_STRING(txt,0,GET_LENGTH_OF_LITERAL_STRING(txt)) //sReturn = txt return sReturn ENDIF if resource[j].menuType=MainType if subType != -1 if resource[j].type = subType iTriggerCount++ ENDIF ELSE iTriggerCount++ ENDIF ENDIF ENDFOR return "Empty" ENDFUNC proc checkIntResourceOverflow(int iResource,int varEntry) int j if iResource < iResourceCount-1 if resource[iResource+1].varStart.startI = resource[iResource].varStart.startI + varEntry for j = iResource+1 to COUNT_OF(resource)-1 resource[j].varStart.startI++ ENDFOR for j = COUNT_OF(i)-1 to resource[iResource+1].varStart.startI step -1 i[j] = i[j-1] ENDFOR i[resource[iResource+1].varStart.startI-1] = 0 //reset the new variable ENDIF ENDIF ENDPROC proc checkFloatResourceOverflow(int iResource,int varEntry) int j if iResource < iResourceCount-1 if resource[iResource+1].varStart.startF = resource[iResource].varStart.startF + varEntry for j = iResource+1 to COUNT_OF(resource)-1 resource[j].varStart.startF++ ENDFOR for j = COUNT_OF(f)-1 to resource[iResource+1].varStart.startF step -1 f[j] = f[j-1] ENDFOR f[resource[iResource+1].varStart.startf-1] = 0 //reset the new variable ENDIF ENDIF ENDPROC proc checkVectorResourceOverflow(int iResource,int varEntry) int j if iResource < iResourceCount-1 if resource[iResource+1].varStart.startV = resource[iResource].varStart.startV + varEntry for j = iResource+1 to COUNT_OF(resource)-1 resource[j].varStart.startV++ ENDFOR for j = COUNT_OF(v)-1 to resource[iResource+1].varStart.startV step -1 v[j] = v[j-1] ENDFOR v[resource[iResource+1].varStart.startV-1] = <<0,0,0>> //reset the new variable ENDIF ENDIF ENDPROC proc checkTwResourceOverflow(int iResource,int varEntry) int j if iResource < iResourceCount-1 if resource[iResource+1].varStart.startTw = resource[iResource].varStart.startTw + varEntry for j = iResource+1 to COUNT_OF(resource)-1 resource[j].varStart.startTw++ ENDFOR for j = COUNT_OF(tw)-1 to resource[iResource+1].varStart.startTw step -1 tw[j] = tw[j-1] ENDFOR // tw[resource[iResource+1].varStart.startTw-1] = 0 //reset the new variable ENDIF ENDIF ENDPROC proc checkModResourceOverflow(int iResource,int varEntry) int j if iResource < iResourceCount-1 if resource[iResource+1].varStart.startMod = resource[iResource].varStart.startMod + varEntry for j = iResource+1 to COUNT_OF(resource)-1 resource[j].varStart.startMod++ ENDFOR for j = COUNT_OF(mod)-1 to resource[iResource+1].varStart.startMod step -1 mod[j] = mod[j-1] ENDFOR mod[resource[iResource+1].varStart.startMod-1] = DUMMY_MODEL_FOR_SCRIPT //reset the new variable ENDIF ENDIF ENDPROC proc checkBoolResourceOverflow(int iResource,int varEntry) int j if iResource < iResourceCount-1 if resource[iResource+1].varStart.startB = resource[iResource].varStart.startB + varEntry for j = iResource+1 to COUNT_OF(resource)-1 resource[j].varStart.startB++ ENDFOR for j = COUNT_OF(b)-1 to resource[iResource+1].varStart.startB step -1 b[j] = b[j-1] ENDFOR b[resource[iResource+1].varStart.startB-1] = FALSE //reset the new variable ENDIF ENDIF ENDPROC proc addWidgetCombo(int iResource, int varEntry, string label, string tl1,string tl2=null,string tl3=null,string tl4=null,string tl5=null,string tl6=null, string tl7=null, string tl8=null,string tl9=null, string tTwenty=null, string t21=null, string t22=null, string t23=null) PRINTLN("addWidgetCombo()") checkIntResourceOverflow(iResource,varEntry) if bJustCounting=FALSE START_NEW_WIDGET_COMBO() ADD_TO_WIDGET_COMBO(tl1) if not is_string_null(tl2) ADD_TO_WIDGET_COMBO(tl2) ENDIF if not is_string_null(tl3) ADD_TO_WIDGET_COMBO(tl3) ENDIF if not is_string_null(tl4) ADD_TO_WIDGET_COMBO(tl4) ENDIF if not is_string_null(tl5) ADD_TO_WIDGET_COMBO(tl5) ENDIF if not is_string_null(tl6) ADD_TO_WIDGET_COMBO(tl6) ENDIF if not is_string_null(tl7) ADD_TO_WIDGET_COMBO(tl7) ENDIF if not is_string_null(tl8) ADD_TO_WIDGET_COMBO(tl8) ENDIF if not is_string_null(tl9) ADD_TO_WIDGET_COMBO(tl9) ENDIF if not is_string_null(tTwenty) ADD_TO_WIDGET_COMBO(tTwenty) ENDIF if not is_string_null(t21) ADD_TO_WIDGET_COMBO(t21) ENDIF if not is_string_null(t22) ADD_TO_WIDGET_COMBO(t22) ENDIF if not is_string_null(t23) ADD_TO_WIDGET_COMBO(t23) ENDIF STOP_WIDGET_COMBO(label,i[resource[iResource].varStart.startI+varEntry]) ELSE iCount++ ENDIF ENDPROC proc addWidgetComboStorage(int iResource, int varEntry) checkIntResourceOverflow(iResource,varEntry) PRINTLN("addWidgetComboStorage()") if bJustCounting=FALSE ELSE iCount++ ENDIF ENDPROC PROC addWidgetTextEntry(int iResource, int varEntry,string title) checkTwResourceOverflow(iResource,varEntry) PRINTLN("addWidgetTextEntry()") if bJustCounting=FALSE tw[resource[iResource].varStart.startTw+varEntry] = ADD_TEXT_WIDGET(title) ELSE twCount++ ENDIF ENDPROC proc addBool(int iResource, int varEntry, string title) checkBoolResourceOverflow(iResource,varEntry) PRINTLN("addBool()") if bJustCounting=FALSE ADD_WIDGET_BOOL(title,b[resource[iResource].varStart.startB+varEntry]) ELSE bCount++ ENDIF ENDPROC proc addBoolStorage(int iResource, int varEntry) checkIntResourceOverflow(iResource,varEntry) PRINTLN("addBoolStorage()") if bJustCounting=FALSE ELSE bCount++ ENDIF ENDPROC proc addFloat(int iResource, int varEntry, string title,float min, float max, float slider_step) checkFloatResourceOverflow(iResource,varEntry) PRINTLN("addFloat()") if bJustCounting=FALSE ADD_WIDGET_float_SLIDER(title,f[resource[iResource].varStart.startF+varEntry],min,max,slider_step) ELSE fCount++ ENDIF ENDPROC proc addInt(int iResource, int varEntry, string title,int min, int max, int slider_step) checkIntResourceOverflow(iResource,varEntry) PRINTLN("addInt()") if bJustCounting=FALSE ADD_WIDGET_INT_SLIDER(title,i[resource[iResource].varStart.startI+varEntry],min,max,slider_step) ELSE iCount++ ENDIF ENDPROC proc addIntStorage(int iResource, int varEntry) checkIntResourceOverflow(iResource,varEntry) PRINTLN("addIntStorage()") if bJustCounting=FALSE ELSE iCount++ ENDIF ENDPROC proc addVector(int iResource, int varEntry, string title, float min, float max, float slider_step) PRINTLN("addVector()") checkVectorResourceOverflow(iResource,varEntry) if bJustCounting=FALSE ADD_WIDGET_VECTOR_SLIDER(title,v[resource[iResource].varStart.startV+varEntry],min,max,slider_step) ELSE vCount++ ENDIF ENDPROC proc addVectorStorage(int iResource, int varEntry) PRINTLN("addVectorStorage()") checkVectorResourceOverflow(iResource,varEntry) if bJustCounting=FALSE ELSE vCount++ ENDIF ENDPROC proc addModelStorage(int iResource, int varEntry) PRINTLN("addModelStorage()") checkModResourceOverflow(iResource,varEntry) if bJustCounting=FALSE ELSE modCount++ ENDIF ENDPROC proc addResourceWidgetType(int iEntry, string stxtWidget=null) //int fdfdf = COUNT_OF(MODEL_NAMES) //fdfdf = fdfdf //IS_MODEL_A_PED() //int ji int ji /* PRINTLN("addResourceWidgetType()") for j = 0 to iResourceCount-1 PRINTLN("resource[",j,"].starti: ",resource[j].varStart.startI," to ",resource[j+1].varStart.startI-1) for jj = resource[j].varStart.startI to resource[j+1].varStart.startI-1 PRINTLN("i[",jj,"]",i[jj]) ENDFOR ENDFOR */ TEXT_LABEL_23 txtlbl = stxtWidget if resource[iEntry].menuType = 0 //asset addWidgetCombo(iEntry,0,"Resource Type","None","Vehicle","Ped","Force","Vehicle Damage","Bezier Path","Explosion","Veh Recording","object","Cam Setup","Anim Dict") ELIF resource[iEntry].menuType = 1 //trigger addBoolStorage(iEntry,0) //set to true when trigger conditions are met. addWidgetCombo(iEntry,0,"Trigger Type","None","entity in area","Time in recording","distance between entities","time in anim") ELIF resource[iEntry].menuType = 2 //event addWidgetCombo(iEntry,0,"Resource Type","None","Ped actions","ped anims","Vehicle Actions","Entity on Bezier") addintStorage(iEntry,1) //playing state endif SWITCH resource[iEntry].type case 1 //vehicle addWidgetTextEntry(iEntry,0,"Model") if bJustCounting=FALSE if DOES_TEXT_WIDGET_EXIST(tw[resource[iEntry].varStart.startTw]) SET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iEntry].varStart.startTw],txtlbl) ENDIF ENDIF addBool(iEntry,0,"Spawn vehicle") addModelStorage(iEntry,0) //mod[resource[iEntry].varStart.startMod] addintStorage(iEntry,1) //vehicle index 1 BREAK case 2 //ped //GET_PED_MODEL_FROM_INDEX() addWidgetTextEntry(iEntry,0,"Model") if bJustCounting=FALSE if DOES_TEXT_WIDGET_EXIST(tw[resource[iEntry].varStart.startTw]) SET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iEntry].varStart.startTw],txtlbl) ENDIF ENDIF addBool(iEntry,0,"Spawn ped") addIntStorage(iEntry,1) //store ped index as int BREAK CASE 3 //force //int drop-down combo force type addWidgetCombo(iEntry,1,"FORCE","IMPULSE","EXTERNAL FORCE","EXTERNAL IMPULSE","TORQUE","ANGULAR IMPULSE") //vector force addVector(iEntry,0,"Force",-1000.0,1000.0,0.1) //vector offset addVector(iEntry,1,"Offset",-15.0,15.0,0.1) //bool local force addBool(iEntry,0,"Local Force") //bool local offset addBool(iEntry,1,"Local Offset") //bool scale by mass addBool(iEntry,2,"scale by mass") addint(iEntry,2,"Duration",0,60000,1) //time addIntStorage(iEntry,3) //keeps track of time addBool(iEntry,3,"APPLY FORCE TO USED PLAYER/VEHICLE") //APPLY_FORCE_TO_ENTITY(vehicle[VEH_PLAYER].id,APPLY_TYPE_IMPULSE,<<0,fImpulse,0>>,<<0,0,0>>,0,true,true,true) BREAK case 4 //vehicle damage addBool(iEntry,0,"Apply Damage") addBool(iEntry,1,"Local Damage") addVector(iEntry,0,"Force",-20.0,20.0,0.05) addfloat(iEntry,0,"Damage",-1000,10000,1) addfloat(iEntry,1,"Deformation",-1000,10000,1) BREAK case 5 //bezier addBool(iEntry,0,"Show Bezier") addint(iEntry,1,"No of nodes",0,20,1) addIntStorage(iEntry,2) //store number of nodes to detect when player changes above value addint(iEntry,3,"Set node to edit",0,20,1) addBool(iEntry,1,"Set node pos to debug cam") addBool(iEntry,2,"Set control to debug cam") for ji = 0 to i[resource[iEntry].varStart.startI+1]-1 addVectorStorage(iEntry,0) //pos addVectorStorage(iEntry,1) //control addVectorStorage(iEntry,2) //rot ENDFOR /* STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) */ /* SET_CURRENT_WIDGET_GROUP(resource[iEntry].widget) for ji = 0 to i[resource[iEntry].varStart.startI+1]-1 tl = "node " tl += ji START_WIDGET_GROUP(tl) addVector(v[resource[iEntry].varStart.startV+(ji*3)],"Pos",-8000.0,8000.0,0.1) addVector(v[resource[iEntry].varStart.startV+1+(ji*3)],"Control",-200.0,200.0,0.1) addVector(v[resource[iEntry].varStart.startV+2+(ji*3)],"Rot",-180.0,180.0,0.1) STOP_WIDGET_GROUP() ENDFOR CLEAR_CURRENT_WIDGET_GROUP(resource[iEntry].widget) */ BREAK case 6 //explosion BREAK case 7 //recording addWidgetTextEntry(iEntry,0,"Recording Name") if bJustCounting=FALSE if DOES_TEXT_WIDGET_EXIST(tw[resource[iEntry].varStart.startTw]) SET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iEntry].varStart.startTw],txtlbl) ENDIF ENDIF addint(iEntry,1,"rec to test?",0,999,1) addBool(iEntry,0,"Test Now") break case 8 //object addint(iEntry,1,"object enum value",-2147483647,2147483647,1) addIntStorage(iEntry,2) // 2: store to check if id changed by user addIntStorage(iEntry,3) // 3:store id of object addBool(iEntry,0,"Test Now") BREAK case 9 //cam setup addWidgetCombo(iEntry,1,"Cam type","Static","pan","follow bez") addIntStorage(iEntry,2) //store previous state of above addint(iEntry,3,"Time duration",0,120000,10) addBool(iEntry,0,"Test cam") if i[resource[iEntry].varStart.startI+1] = 0 addBool(iEntry,1,"Pos cam start to debug") addVector(iEntry,0,"Pos",-8000.0,8000.0,0.1) addVector(iEntry,1,"Rot",-180.0,180.0,0.1) ELIF i[resource[iEntry].varStart.startI+1] = 1 addBool(iEntry,1,"Pos cam start to debug") addBool(iEntry,2,"Pos cam end to debug") addVector(iEntry,0,"Cam start pos",-8000.0,8000.0,0.1) addVector(iEntry,1,"Cam start rot",-180.0,180.0,0.1) addVector(iEntry,2,"cam end pos",-8000.0,8000.0,0.1) addVector(iEntry,3,"cam end rot",-180.0,180.0,0.1) ELIF i[resource[iEntry].varStart.startI+1] = 2 addint(iEntry,4,"Select Bezier",0,10,1) addIntStorage(iEntry,5) //store bezier to use ENDIF BREAK case 10 //animation bank addWidgetTextEntry(iEntry,0,"Anim Dict") if bJustCounting=FALSE if DOES_TEXT_WIDGET_EXIST(tw[resource[iEntry].varStart.startTw]) SET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iEntry].varStart.startTw],txtlbl) ENDIF ENDIF BREAK case 101 //entity in area addWidgetCombo(iEntry,1,"Entity type","Ped","Vehicle","Object") addint(iEntry,2,"Entity entry",0,20,1) addBool(iEntry,0,"Set Location from player") addVector(iEntry,0,"Check location",-8000.0,8000.0,0.1) PRINTLN("Define readius of check:",f[resource[iEntry].varStart.startF]) PRINTLN("resource[4].varStart.startF",resource[iEntry].varStart.startF) PRINTLN("iEntry:",iEntry) addFloat(iEntry,0,"Check Radius",0.0,100.0,0.01) addBool(iEntry,1,"Show locate") BREAK case 102 //trigger time in recording //vehicle to watch addint(iEntry,1,"vehicle check",0,20,1) //recording number played addint(iEntry,2,"Check rec no.",0,999,1) //time in recording addFloat(iEntry,0,"Time in rec",0.0,120000.0,10.0) break case 104 //time in anim addint(iEntry,1,"Ped to check",0,20,1) addint(iEntry,2,"Anim dict entry",0,20,1) addWidgetTextEntry(iEntry,0,"Anim Name") if bJustCounting=FALSE if DOES_TEXT_WIDGET_EXIST(tw[resource[iEntry].varStart.startTw]) SET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iEntry].varStart.startTw],txtlbl) ENDIF ENDIF addFloat(iEntry,0,"Time in anim (-1.0=finised)",-1.0,120000.0,0.01) addBoolStorage(iEntry,0) //store when required anim is playing BREAK case 201 //create ped and give actions //trigger addint(iEntry,2,"Trigger (-1 = on Start)",-1,30,1) //action addint(iEntry,3,"Ped to use",0,20,1) addWidgetCombo(iEntry,4,"Action","Spawn","Go to coord") addIntStorage(iEntry,5) //store previous state of above if i[resource[iEntry].varStart.startI+4] = 0 //spawn addBool(iEntry,0,"Set spawn pos from player") addVector(iEntry,0,"Spawn pos",-8000.0,8000.0,0.1) addFloat(iEntry,0,"Heading",-180.0,180.0,0.1) ELIF i[resource[iEntry].varStart.startI+4] = 1 //go to coord addBool(iEntry,0,"Set goto pos from player") addVector(iEntry,0,"Go to coord",-8000.0,8000.0,0.1) addWidgetCombo(iEntry,6,"Speed","Walk","Run","Sprint") ENDIF BREAK case 202 //ped anims addint(iEntry,2,"Trigger (-1 = on Start)",-1,30,1) addint(iEntry,3,"Ped to use",0,20,1) addint(iEntry,4,"Anim dict to use",0,20,1) addWidgetTextEntry(iEntry,0,"Anim to play") if bJustCounting=FALSE if DOES_TEXT_WIDGET_EXIST(tw[resource[iEntry].varStart.startTw]) SET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iEntry].varStart.startTw],txtlbl) ENDIF ENDIF addBool(iEntry,0,"Set start location") addVector(iEntry,0,"Start pos",-8000.0,8000.0,0.1) addFloat(iEntry,0,"Heading",-180.0,180.0,0.1) addFloat(iEntry,1,"Blend in",0.0,10.0,0.01) addFloat(iEntry,2,"Blend out",0.0,10.0,0.01) addBool(iEntry,1,"Stores no of anim flags") addIntStorage(iEntry,5) //stores no of anim flags if i[resource[iEntry].varStart.startI+5] != 0 for ji = 0 to i[resource[iEntry].varStart.startI+5]-1 addWidgetCombo(iEntry,6+ji,"Anim flag","AF_DEFAULT", "AF_EXIT_AFTER_INTERRUPTED", "AF_EXTRACT_INITIAL_OFFSET", "AF_HOLD_LAST_FRAME", "AF_IGNORE_GRAVITY", "AF_LOOPING", "AF_NOT_INTERRUPTABLE", "AF_OVERRIDE_PHYSICS", "AF_REORIENT_WHEN_FINISHED", "AF_REPOSITION_WHEN_FINISHED", "AF_SECONDARY", "AF_TURN_OFF_COLLISION", "AF_UPPERBODY") ENDFOR ENDIF BREAK case 203 //Vehicle Actions addint(iEntry,2,"Trigger (-1 = on Start)",-1,30,1) addint(iEntry,3,"Veh to use",0,20,1) addWidgetCombo(iEntry,4,"Action","Spawn","Trigger Recording") addIntStorage(iEntry,5) //store previous state of above if i[resource[iEntry].varStart.startI+4] = 0 //spawn addBool(iEntry,0,"Set spawn pos from player") addVector(iEntry,0,"Spawn pos",-8000.0,8000.0,0.1) addFloat(iEntry,0,"Heading",-180.0,180.0,0.1) ELIF i[resource[iEntry].varStart.startI+4] = 1 //trigger recording addint(iEntry,6,"Recording to play",0,999,1) //skip duration in recording addFloat(iEntry,1,"Skip time in rec (ms)",0,120000,1) ENDIF BREAK case 204 //entity follow bezier curve addint(iEntry,2,"Trigger (-1 = on Start)",-1,30,1) addWidgetCombo(iEntry,3,"Entity type","Ped","Vehicle","Object") addint(iEntry,4,"Entity entry",0,20,1) addint(iEntry,5,"Bezier entry",0,20,1) addint(iEntry,6,"Time Duration",0,120000,1) addIntStorage(iEntry,7) // 7: current time playing back addBool(iEntry,0,"Set first point to entity pos") BREAK ENDSWITCH ENDPROC proc initResourceWidget() PRINTLN("initResourceWidget()") int j //int ji int ji TEXT_LABEL_23 tl if not DOES_WIDGET_GROUP_EXIST(resourceWidget) SET_CURRENT_WIDGET_GROUP(parentWidget) resourceWidget = START_WIDGET_GROUP("Resources") ADD_WIDGET_BOOL("Add resource",bAddResource) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(parentWidget) ENDIF string sTxlbl for j = 0 to iResourceCount-1 sTxlbl=null if resource[j].menuType = 0 SET_CURRENT_WIDGET_GROUP(resourceWidget) if DOES_WIDGET_GROUP_EXIST(resource[j].widget) if DOES_TEXT_WIDGET_EXIST(tw[resource[j].varStart.startTw]) sTxlbl = GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw]) ENDIF DELETE_WIDGET_GROUP(resource[j].widget) PRINTLN("DELETE_WIDGET_GROUP(resource[j(",j,")].widget)") ENDIF CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) SWITCH resource[j].type case 0 //not set SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP("New Resource") PRINTLN("START_WIDGET_GROUP()",j) addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) BREAK case 1 //vehicle SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(0,j,resource[j].type,"Vehicle")) PRINTLN("START_WIDGET_GROUP()",j) addResourceWidgetType(j,sTxlbl) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) BREAK case 2 SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(0,j,resource[j].type,"Ped")) PRINTLN("START_WIDGET_GROUP()",j) addResourceWidgetType(j,sTxlbl) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) BREAK case 3 SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(0,j,resource[j].type,"Force")) PRINTLN("START_WIDGET_GROUP()",j) addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) BREAK case 4 SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(0,j,resource[j].type,"Vehicle Damage")) PRINTLN("START_WIDGET_GROUP()",j) addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) BREAK case 5 SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(0,j,resource[j].type,"Bezier Path")) PRINTLN("START_WIDGET_GROUP()",j) addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) SET_CURRENT_WIDGET_GROUP(resource[j].widget) for ji = 0 to i[resource[j].varStart.startI+1]-1 tl = "node " tl += ji START_WIDGET_GROUP(tl) addVector(j,(ji*3),"Pos",-8000.0,8000.0,0.1) addVector(j,1+(ji*3),"Control",-200.0,200.0,0.1) addVector(j,2+(ji*3),"Rot",-180.0,180.0,0.1) STOP_WIDGET_GROUP() ENDFOR CLEAR_CURRENT_WIDGET_GROUP(resource[j].widget) BREAK case 6 SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(0,j,resource[j].type,"Explosion")) PRINTLN("START_WIDGET_GROUP()",j) addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) BREAK case 7 SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(0,j,resource[j].type,"Vehicle Recording")) PRINTLN("START_WIDGET_GROUP()",j) addResourceWidgetType(j,sTxlbl) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) BREAK case 8 SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(0,j,resource[j].type,"Object")) addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) BREAK case 9 SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(0,j,resource[j].type,"Camera Cut")) PRINTLN("START_WIDGET_GROUP()",j) addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) BREAK case 10 SET_CURRENT_WIDGET_GROUP(resourceWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(0,j,resource[j].type,"Anim dict")) addResourceWidgetType(j,sTxlbl) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(resourceWidget) BREAK ENDSWITCH ENDIF ENDFOR ENDPROC proc initTriggerWidget() PRINTLN("initTriggerWidget()") int j if not DOES_WIDGET_GROUP_EXIST(TriggerWidget) SET_CURRENT_WIDGET_GROUP(parentWidget) TriggerWidget = START_WIDGET_GROUP("Triggers") ADD_WIDGET_BOOL("Add to Triggers",bAddTrigger) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(parentWidget) ENDIF string sTxlbl for j = 0 to iResourceCount-1 sTxlbl=null if resource[j].menuType = 1 SET_CURRENT_WIDGET_GROUP(TriggerWidget) if DOES_WIDGET_GROUP_EXIST(resource[j].widget) if DOES_TEXT_WIDGET_EXIST(tw[resource[j].varStart.startTw]) sTxlbl = GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw]) sTxlbl=sTxlbl ENDIF DELETE_WIDGET_GROUP(resource[j].widget) ENDIF CLEAR_CURRENT_WIDGET_GROUP(TriggerWidget) SWITCH resource[j].type case 100 //not set SET_CURRENT_WIDGET_GROUP(TriggerWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(1,j,-1,"Trigger ")) //resource[j].type = 200 addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(TriggerWidget) BREAK case 101 //entity in area SET_CURRENT_WIDGET_GROUP(TriggerWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(1,j,-1,"Entity in area ")) addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(TriggerWidget) BREAK case 102 //time in recording SET_CURRENT_WIDGET_GROUP(TriggerWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(1,j,-1,"time in recording ")) addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(TriggerWidget) BREAK case 103 //distance between entities SET_CURRENT_WIDGET_GROUP(TriggerWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(1,j,-1,"Distance from entity ")) addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(TriggerWidget) BREAK case 104 //time in anim SET_CURRENT_WIDGET_GROUP(TriggerWidget) resource[j].widget = START_WIDGET_GROUP(GET_RESOURCE_NAME(1,j,-1,"Time in anim ")) addResourceWidgetType(j,sTxlbl) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(TriggerWidget) BREAK /* case 201 //not set SET_CURRENT_WIDGET_GROUP(scenarioWidget) resource[j].widget = START_WIDGET_GROUP("Ped actions") addResourceWidgetType(j) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(scenarioWidget) BREAK */ ENDSWITCH ENDIF ENDFOR ENDPROC func bool HAS_EVENT_TRIGGER_RULE_BEEN_MET(int trigger) INT iResourceB string sTemp, sTempB ped_index thisPed if trigger != -1 PRINTLN("Find resource entry for trigger: ",trigger) int iResource = FIND_NTH_RESOURCE_ENTRY(trigger,1) PRINTLN("iResource entry: ",iResource) if iResource != -1 switch resource[iResource].type case 101 //entity in area if i[resource[iResource].varStart.startI+1] = 0 //entity is ped tempPed = eventToPed(FIND_NTH_RESOURCE_ENTRY(i[resource[iResource].varStart.startI+2],0,2)) if not IS_PED_INJURED(tempPed) if IS_ENTITY_AT_COORD(tempPed,v[resource[iResource].varStart.startV],<>) return TRUE ENDIF ENDIF ELIF i[resource[iResource].varStart.startI+1] = 1 //entity is veh tempVeh = eventToVeh(FIND_NTH_RESOURCE_ENTRY(i[resource[iResource].varStart.startI+2],0,1)) if IS_VEHICLE_DRIVEABLE(tempVeh) if IS_ENTITY_AT_COORD(tempVeh,v[resource[iResource].varStart.startV],<>) return TRUE ENDIF ENDIF ELIF i[resource[iResource].varStart.startI+1] = 2 //entity is object ENDIF BREAK case 102 //trigger time in recording PRINTLN("102") PRINTLN("resource entry for vehicle 0: ",FIND_NTH_RESOURCE_ENTRY(i[resource[iResource].varStart.startI+1],0,1)) tempVeh = eventToVeh(FIND_NTH_RESOURCE_ENTRY(i[resource[iResource].varStart.startI+1],0,1)) if IS_VEHICLE_DRIVEABLE(tempVeh) PRINTLN("veh does exist") if IS_PLAYBACK_GOING_ON_FOR_VEHICLE(tempVeh) if GET_PLAYBACK_NUMBER_FOR_VEHICLE_VIA_RECID(tempVeh) = i[resource[iResource].varStart.startI+2] if GET_TIME_POSITION_IN_RECORDING(tempVeh) >= f[resource[iResource].varStart.startF] return TRUE ENDIF ENDIF ENDIF ENDIF //vehicle BREAK case 104 //check anim time iResourceB = FIND_NTH_RESOURCE_ENTRY(i[resource[iResource].varStart.startI+1],0,2) //resource entry for ped if i[resource[iResourceB].varStart.startI+1] != 0 thisPed = int_to_native(ped_index,i[resource[iResourceB].varStart.startI+1]) if not IS_PED_INJURED(thisPed) PRINTLN("ped alive") iResourceB = FIND_NTH_RESOURCE_ENTRY(i[resource[iResource].varStart.startI+2],0,10) //entry for anim dict if DOES_TEXT_WIDGET_EXIST(tw[resource[iResourceB].varStart.startTw]) stemp = GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iResourceB].varStart.startTw]) PRINTLN("anim dict to check: ",stemp) if not Is_String_Null_Or_Empty(stemp) stempb = GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iResource].varStart.startTw]) PRINTLN("ani name: ",stempb) if not Is_String_Null_Or_Empty(stemp) if IS_ENTITY_PLAYING_ANIM(thisPed,stemp,stempb) PRINTLN("anim playing") b[resource[iResource].varStart.startb] = TRUE if f[resource[iResource].varStart.startF] != -1.0 if GET_ENTITY_ANIM_CURRENT_TIME(thisPed,stemp,stempb) >= f[resource[iResource].varStart.startf] return TRUE ENDIF ENDIF ELSE PRINTLN("anim finished playing") if b[resource[iResource].varStart.startb] = TRUE and f[resource[iResource].varStart.startF] = -1.0 return TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF break ENDSWITCH ENDIF ENDIF return FALSE ENDFUNC proc initScenarioWidget() PRINTLN("initScenarioWidget()") int j if not DOES_WIDGET_GROUP_EXIST(scenarioWidget) SET_CURRENT_WIDGET_GROUP(parentWidget) scenarioWidget = START_WIDGET_GROUP("Scenario Builder") ADD_WIDGET_BOOL("Add to scenario",bAddToScenario) ADD_WIDGET_BOOL("Play Scenario",bPlayScenario) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(parentWidget) ENDIF string sTxlbl for j = 0 to iResourceCount-1 sTxlbl=null if resource[j].menuType = 2 SET_CURRENT_WIDGET_GROUP(scenarioWidget) if DOES_WIDGET_GROUP_EXIST(resource[j].widget) if DOES_TEXT_WIDGET_EXIST(tw[resource[j].varStart.startTw]) sTxlbl = GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw]) sTxlbl=sTxlbl ENDIF DELETE_WIDGET_GROUP(resource[j].widget) ENDIF CLEAR_CURRENT_WIDGET_GROUP(scenarioWidget) SWITCH resource[j].type case 200 //not set SET_CURRENT_WIDGET_GROUP(scenarioWidget) resource[j].widget = START_WIDGET_GROUP("New Element") //resource[j].type = 200 addResourceWidgetType(j,sTxlbl) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(scenarioWidget) BREAK case 201 //ped actions SET_CURRENT_WIDGET_GROUP(scenarioWidget) resource[j].widget = START_WIDGET_GROUP("Ped actions") addResourceWidgetType(j,sTxlbl) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(scenarioWidget) BREAK CASE 202 // ped anims SET_CURRENT_WIDGET_GROUP(scenarioWidget) resource[j].widget = START_WIDGET_GROUP("Ped anim") addResourceWidgetType(j,sTxlbl) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(scenarioWidget) BREAK case 203 //nvehicle actions SET_CURRENT_WIDGET_GROUP(scenarioWidget) resource[j].widget = START_WIDGET_GROUP("Veh actions") addResourceWidgetType(j,sTxlbl) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(scenarioWidget) BREAK case 204 //entity follow bezier SET_CURRENT_WIDGET_GROUP(scenarioWidget) resource[j].widget = START_WIDGET_GROUP("Entity follow bezier") addResourceWidgetType(j,sTxlbl) STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(scenarioWidget) BREAK case 205 //vehicle damage BREAK case 206 //apply force to entity BREAK case 207 //explosion BREAK ENDSWITCH ENDIF ENDFOR ENDPROC PROC initWidgets() PRINTLN("initWidgets()") if not DOES_WIDGET_GROUP_EXIST(parentWidget) parentWidget = START_WIDGET_GROUP("Scene Builder") ADD_WIDGET_BOOL("EXIT",bEXIT) ADD_WIDGET_BOOL("dEBUG",bDebug) ADD_WIDGET_BOOL("Load data",bloadData) ADD_WIDGET_BOOL("Save data",bSaveData) STOP_WIDGET_GROUP() initResourceWidget() initTriggerWidget() initScenarioWidget() ENDIF v[0] = v[0] i[0] =i[0] f[0] =f[0] b[0] =b[0] tw[0] =tw[0] ENDPROC proc COUNT_VARS(int iResEntry) PRINTLN("COUNT_VARS()") vCount=0 fCount=0 iCount=0 bCount=0 twCount=0 modCount=0 bJustCounting=true addResourceWidgetType(iResEntry) bJustCounting=FALSE ENDPROC proc GET_NEW_START_VALUES(int iResourceEntry) PRINTLN("GET_NEW_START_VALUES(",iResourceEntry,")") int j COUNT_VARS(iResourceEntry) for j= iResourceEntry+1 to COUNT_OF(resource)-1 resource[j].varStart.startV = resource[iResourceEntry].varStart.startV+vCount resource[j].varStart.startF = resource[iResourceEntry].varStart.startF+fCount resource[j].varStart.startI = resource[iResourceEntry].varStart.startI+iCount resource[j].varStart.startB = resource[iResourceEntry].varStart.startB+bCount resource[j].varStart.startTw = resource[iResourceEntry].varStart.startTw+twCount resource[j].varStart.startMod = resource[iResourceEntry].varStart.startMod+modCount ENDFOR ENDPROC proc AMEND_VAR_ENTRIES(int iEntry) int J COUNT_VARS(iEntry) if TwCount > 0 for j = 0 to TwCount-1 if DOES_TEXT_WIDGET_EXIST(tw[resource[iEntry].varStart.startTw+j]) SET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iEntry].varStart.startTw+j],"") ENDIF ENDFOR ENDIF //find difference between existing var count and new var count, in order to add or remove vars accordingly. vCount = vCount - (resource[iEntry+1].varStart.startV - resource[iEntry].varStart.startV) fCount = fCount - (resource[iEntry+1].varStart.startF - resource[iEntry].varStart.startF) iCount = iCount - (resource[iEntry+1].varStart.startI - resource[iEntry].varStart.startI) bCount = bCount - (resource[iEntry+1].varStart.startB - resource[iEntry].varStart.startB) TwCount = TwCount - (resource[iEntry+1].varStart.startTw - resource[iEntry].varStart.startTw) modCount = modCount - (resource[iEntry+1].varStart.startMod - resource[iEntry].varStart.startMod) if vCount > 0 for j = COUNT_OF(v)-1 TO resource[iEntry+1].varStart.startV+vCount STEP -1 IF j-vCount >= 0 v[j] = v[j-vCount] ENDIF ENDFOR for j = resource[iEntry].varStart.startv to resource[iEntry].varStart.startv+vCount-1 v[j] = <<0,0,0>> ENDFOR ENDIF if vCount < 0 for j = resource[iEntry+1].varStart.startV+vCount to COUNT_OF(v)-1 if j - vCount < COUNT_OF(v) v[j] = v[j-vCount] ENDIF ENDFOR ENDIF // int i if iCount > 0 for j = COUNT_OF(i)-1 TO resource[iEntry+1].varStart.startI+iCount STEP -1 IF j-iCount >= 0 i[j] = i[j-iCount] ENDIF ENDFOR for j = resource[iEntry].varStart.starti+1 to resource[iEntry].varStart.starti+iCount //don't reset the first entry for each widget as that stores the widget type. i[j] = 0 ENDFOR ENDIF if iCount < 0 for j = resource[iEntry+1].varStart.startI+iCount to COUNT_OF(i)-1 if j - iCount < COUNT_OF(i) i[j] = i[j-iCount] ENDIF ENDFOR ENDIF //float f if fcount > 0 for j = COUNT_OF(f)-1 TO resource[iEntry+1].varStart.startf+fCount STEP -1 IF j-fcount >= 0 f[j] = f[j-fcount] ENDIF ENDFOR for j = resource[iEntry].varStart.startf to resource[iEntry].varStart.startf+fCount-1 f[j] = 0 ENDFOR ENDIF if fcount < 0 for j = resource[iEntry+1].varStart.startf+fCount to COUNT_OF(f)-1 if j - fCount < COUNT_OF(f) f[j] = f[j-fcount] ENDIF ENDFOR ENDIF //bools PRINTLN("bcount for change ",bCount) PRINTLN("b[0] before change = ",b[0]) PRINTLN("b[1] before change = ",b[1]) PRINTLN("b[2] before change = ",b[2]) PRINTLN("b[3] before change = ",b[3]) PRINTLN("b[4] before change = ",b[4]) PRINTLN("b[5] before change = ",b[5]) if bcount > 0 PRINTLN("NUDGE VALUES: for j = ",COUNT_OF(b)-1," to ",resource[iEntry+1].varStart.startb+bCount," step -1") for j = COUNT_OF(b)-1 TO resource[iEntry+1].varStart.startb+bCount STEP -1 IF j-bcount >= 0 PRINTLN("b[",j,"] = ",b[j-bCount]) b[j] = b[j-bcount] ENDIF ENDFOR for j = resource[iEntry].varStart.startB to resource[iEntry].varStart.startb+bCount PRINTLN("b[",j,"] = false") b[j] = FALSE ENDFOR ENDIF if bcount < 0 PRINTLN("SET TO ZERO: for j = ",resource[iEntry+1].varStart.startb+BCount," to ",COUNT_OF(b)-1) for j = resource[iEntry+1].varStart.startB+BCount to COUNT_OF(b)-1 IF j-BCount < COUNT_OF(B) PRINTLN("b[",j,"] = ",b[j-bcount]) b[j] = b[j-bcount] ENDIF ENDFOR ENDIF PRINTLN("b[0] after change = ",b[0]) PRINTLN("b[1] after change = ",b[1]) PRINTLN("b[2] after change = ",b[2]) PRINTLN("b[3] after change = ",b[3]) PRINTLN("b[4] after change = ",b[4]) PRINTLN("b[5] after change = ",b[5]) //Text widgets if twCount > 0 for j = COUNT_OF(tw)-1 TO resource[iEntry+1].varStart.startTw+twCount STEP -1 IF j-twCount >= 0 tw[j] = tw[j-twCount] ENDIF ENDFOR //reset newly created vars PRINTLN("RESET TEXT WIDGETS: for j = ",resource[iEntry].varStart.startTw," to ",resource[iEntry].varStart.startTw+twCount-1) for j = resource[iEntry].varStart.startTw to resource[iEntry].varStart.startTw+twCount-1 tw[j]=null ENDFOR ENDIF if twcount < 0 for j = resource[iEntry+1].varStart.startTw+twCount to COUNT_OF(tw)-1 IF j-twCount < COUNT_OF(tw) tw[j] = tw[j-twCount] ENDIF ENDFOR ENDIF if modCount > 0 for j = COUNT_OF(mod)-1 TO resource[iEntry+1].varStart.startMod+modCount STEP -1 IF j-modCount >= 0 mod[j] = mod[j-modCount] ENDIF ENDFOR //reset newly created models for j = resource[iEntry].varStart.startMod to resource[iEntry].varStart.startMod+modCount-1 mod[j]=DUMMY_MODEL_FOR_SCRIPT ENDFOR ENDIF if modcount < 0 for j = resource[iEntry+1].varStart.startMod+modCount to COUNT_OF(mod)-1 IF j-modCount < COUNT_OF(mod) mod[j] = mod[j-modCount] ENDIF ENDFOR ENDIF for j = iEntry+1 to COUNT_OF(resource)-1 resource[j].varStart.startV += vCount resource[j].varStart.startf += fCount resource[j].varStart.starti += iCount resource[j].varStart.startB += bCount resource[j].varStart.startTw += TwCount resource[j].varStart.startMod += modCount ENDFOR ENDPROC proc CHECK_EXIT_SCRIPT() if bEXIT = TRUE DELETE_WIDGET_GROUP(parentWidget) TERMINATE_THIS_THREAD() ENDIF ENDPROC func int GET_VEH_RESOURCE_ENTRY(int iEventCaller) int iCounter,j for j = 0 to COUNT_OF(resource)-1 if resource[j].menuType = 0 if resource[j].type = 1 //vehicle if iCounter = i[resource[iEventCaller].varStart.startI+3] //vehicel to use return j ENDIF iCounter++ ENDIF ENDIF ENDFOR return -1 ENDFUNC func ANIMATION_FLAGS get_anim_flag(int iValue) switch iValue case 0 RETURN AF_DEFAULT BREAK case 1 RETURN AF_EXIT_AFTER_INTERRUPTED BREAK case 2 RETURN AF_EXTRACT_INITIAL_OFFSET BREAK case 3 RETURN AF_HOLD_LAST_FRAME BREAK case 4 RETURN AF_IGNORE_GRAVITY BREAK case 5 RETURN AF_LOOPING BREAK case 6 RETURN AF_NOT_INTERRUPTABLE BREAK case 7 RETURN AF_OVERRIDE_PHYSICS BREAK case 8 RETURN AF_REORIENT_WHEN_FINISHED BREAK case 9 RETURN AF_REPOSITION_WHEN_FINISHED BREAK case 10 RETURN AF_SECONDARY BREAK case 11 RETURN AF_TURN_OFF_COLLISION BREAK case 12 RETURN AF_UPPERBODY BREAK ENDSWITCH RETURN AF_DEFAULT ENDFUNC proc TRIGGER_THIS_EVENT(int ievent) int ji ANIMATION_FLAGS AF = AF_DEFAULT vehicle_index thisVeh PED_INDEX thisPed MODEL_NAMES thisModel int iVehResourceEntry,iResource,iResourceB i[resource[ievent].varStart.startI+1] = 1 //track event triggered state = 1: playing back string sAnimDict,aAnimToPlay PRINTLN("b") switch resource[ievent].type case 201 //ped action iResource = FIND_NTH_RESOURCE_ENTRY(i[resource[ievent].varStart.startI+3],0,2) //resource entry for ped if i[resource[ievent].varStart.startI+4] = 0 //spawn if i[resource[iResource].varStart.startI+1] != 0 thisPed = int_to_native(ped_index,i[resource[iResource].varStart.startI+1]) if DOES_ENTITY_EXIST(thisPed) DELETE_PED(thisPed) ENDIF ENDIF GET_MODEL_FOR_PED(thisModel,GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iResource].varStart.startTw])) thisPed = CREATE_PED(PEDTYPE_MISSION,thisModel,v[resource[ievent].varStart.startV],f[resource[ievent].varStart.startF]) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(thisPed,TRUE) i[resource[iResource].varStart.startI+1] = NATIVE_TO_INT(thisPed) ELIF i[resource[ievent].varStart.startI+4] = 1 //go to coord thisPed = int_to_native(ped_index,i[resource[iResource].varStart.startI+1]) if not IS_PED_INJURED(thisPed) if i[resource[ievent].varStart.startI+6] = 0 TASK_GO_STRAIGHT_TO_COORD(thisPed,v[resource[ievent].varStart.startV],PEDMOVE_WALK) ELIF i[resource[ievent].varStart.startI+6] = 1 TASK_GO_STRAIGHT_TO_COORD(thisPed,v[resource[ievent].varStart.startV],PEDMOVE_RUN) ELIF i[resource[ievent].varStart.startI+6] = 2 TASK_GO_STRAIGHT_TO_COORD(thisPed,v[resource[ievent].varStart.startV],PEDMOVE_SPRINT) ENDIF ENDIF ENDIF BREAK case 202 //ped anims iResource = FIND_NTH_RESOURCE_ENTRY(i[resource[ievent].varStart.startI+3],0,2) //resource entry for ped iResourceB = FIND_NTH_RESOURCE_ENTRY(i[resource[ievent].varStart.startI+4],0,10) //resource for anim dict sAnimDict = GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[iResourceB].varStart.startTw]) aAnimToPlay = GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[ievent].varStart.startTw]) PRINTLN("sAnimDict: ",sAnimDict," aAnimToPlay: ",aAnimToPlay) thisPed = int_to_native(ped_index,i[resource[iResource].varStart.startI+1]) if HAS_ANIM_DICT_LOADED(sAnimDict) if not IS_PED_INJURED(thisPed) if i[resource[ievent].varStart.startI+5] != 0 for ji = 0 to i[resource[ievent].varStart.startI+5]-1 AF += GET_ANIM_FLAG(i[resource[ievent].varStart.startI+6+ji]) ENDFOR ENDIF PRINTLN("blend in: ",f[resource[ievent].varStart.startF+1]) TASK_PLAY_ANIM(thisPed,sAnimDict,aAnimToPlay,f[resource[ievent].varStart.startF+1],f[resource[ievent].varStart.startF+2],-1,AF) ENDIF ELSE SCRIPT_ASSERT("SCRIPT: anim dict not pre loaded") ENDIF BREAK case 203 //vehicle action //get action to perform if i[resource[ievent].varStart.startI+4] = 0 //spawn vehicle iVehResourceEntry = GET_VEH_RESOURCE_ENTRY(ievent) thisVeh = eventToVeh(iVehResourceEntry) if DOES_ENTITY_EXIST(thisVeh) DELETE_VEHICLE(thisVeh) ENDIF thisVeh = CREATE_VEHICLE(mod[resource[iVehResourceEntry].varStart.startMod],v[resource[ievent].varStart.startV],f[resource[ievent].varStart.startF]) VehToEvent(thisVeh,iVehResourceEntry) ELIF i[resource[ievent].varStart.startI+4] = 1 //play recording PRINTLN("c") iVehResourceEntry = GET_VEH_RESOURCE_ENTRY(ievent) thisVeh = eventToVeh(iVehResourceEntry) if not DOES_ENTITY_EXIST(thisVeh) PRINTLN("d") if i[resource[ievent].varStart.startI+6] != 0 and not Is_String_Null_Or_Empty(sVehRecording) PRINTLN("e") if DOES_VEHICLE_RECORDING_FILE_EXIST_IN_CDIMAGE(i[resource[ievent].varStart.startI+6],sVehRecording) PRINTLN("f") vTemp = GET_ROTATION_OF_VEHICLE_RECORDING_AT_TIME(i[resource[ievent].varStart.startI+6],f[resource[iEvent].varStart.startF+1],sVehRecording) thisVeh = CREATE_VEHICLE(mod[resource[iVehResourceEntry].varStart.startMod],GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(i[resource[ievent].varStart.startI+6],f[resource[iEvent].varStart.startF+1],sVehRecording),vtemp.z) VehToEvent(thisVeh,iVehResourceEntry) ENDIF ENDIF ENDIF if IS_VEHICLE_DRIVEABLE(thisVeh) PRINTLN("g") if i[resource[ievent].varStart.startI+6] != 0 and not Is_String_Null_Or_Empty(sVehRecording) PRINTLN("h") START_PLAYBACK_RECORDED_VEHICLE(thisVeh,i[resource[ievent].varStart.startI+6],sVehRecording) PRINTLN("playback skip: ",f[resource[iEvent].varStart.startF+1]) SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(thisVeh,f[resource[iEvent].varStart.startF+1]) ENDIF ENDIF ENDIF BREAK case 204 //entity follow bezier curve //find if entity is ped/vehicle/object if i[resource[ievent].varStart.startI+3] = 0 //entity is ped tempPed = eventToPed(FIND_NTH_RESOURCE_ENTRY(i[resource[ievent].varStart.startI+4],0,2)) if not IS_PED_INJURED(tempPed) useBezier(i[resource[ievent].varStart.startI+5],i[resource[ievent].varStart.startI+7],i[resource[ievent].varStart.startI+6],vtemp,vTempb) SET_ENTITY_COORDS_NO_OFFSET(tempPed,vtemp) SET_ENTITY_ROTATION(tempPed,vtempb) i[resource[ievent].varStart.startI+7] += floor(TIMESTEP()*1000.0) if i[resource[ievent].varStart.startI+7] > i[resource[ievent].varStart.startI+6] i[resource[ievent].varStart.startI+1] = 2 ENDIF ENDIF ELIF i[resource[ievent].varStart.startI+2] = 1 //entity is veh tempVeh = eventToVeh(FIND_NTH_RESOURCE_ENTRY(i[resource[ievent].varStart.startI+4],0,1)) if IS_VEHICLE_DRIVEABLE(tempVeh) ELIF i[resource[ievent].varStart.startI+1] = 2 //entity is object ENDIF ENDIF break ENDSWITCH ENDPROC proc CLEANUP_RESOURCE(int ievent) vehicle_index vehTemp switch resource[ievent].type case 1 vehTemp = INT_TO_NATIVE(vehicle_index,i[resource[ievent].varStart.startI+1]) if DOES_ENTITY_EXIST(vehTemp) if IS_VEHICLE_DRIVEABLE(vehTemp) if IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTemp) STOP_PLAYBACK_RECORDED_VEHICLE(vehTemp) ENDIF ENDIF DELETE_VEHICLE(vehTemp) i[resource[ievent].varStart.startI+1] = 0 ENDIF BREAK case 204 //reset bezier timer i[resource[ievent].varStart.startI+7] = 0 BREAK case 103 b[resource[ievent].varStart.startI] = FALSE BREAK ENDSWITCH ENDPROC proc playbackScenario() int j int iTrigger if bPlayScenario = TRUE for j = 0 to count_of(resource)-1 if resource[j].menuType = 2 //event iTrigger = i[resource[j].varStart.startI+2] if i[resource[j].varStart.startI+1] = 0 if bPlaybackTriggered = FALSE and iTrigger=-1 TRIGGER_THIS_EVENT(j) ENDIF if HAS_EVENT_TRIGGER_RULE_BEEN_MET(iTrigger) TRIGGER_THIS_EVENT(j) ENDIF ELIF i[resource[j].varStart.startI+1] = 1 if resource[j].type = 204 //keep udating for bezier TRIGGER_THIS_EVENT(j) ENDIF ENDIF ENDIF endfor bPlaybackTriggered = TRUE ELSE if bPlaybackTriggered = TRUE bPlaybackTriggered = FALSE for j = 0 to count_of(resource)-1 if resource[j].menuType = 2 //event i[resource[j].varStart.startI+1] = 0 CLEANUP_RESOURCE(j) ENDIF if resource[j].menuType = 0 //resource CLEANUP_RESOURCE(j) ENDIF if resource[j].menuType = 1 //resource b[resource[j].varStart.startB] = FALSE ENDIF endfor ENDIF ENDIF ENDPROC proc INSERT_RESOURCE_INT_ENTRY(int resourceEntry) int j for j = COUNT_OF(i)-1 to resource[resourceEntry+1].varStart.startI+1 step-1 i[j] = i[j-1] ENDFOR i[resource[resourceEntry+1].varStart.startI] = 0 for j = resourceEntry+1 to COUNT_OF(resource)-1 PRINTLN("resource[",j,"].varStart.startI = ",resource[j].varStart.startI) resource[j].varStart.startI++ PRINTLN("resource[",j,"].varStart.startI = ",resource[j].varStart.startI) ENDFOR ENDPROC proc REBUILD_WIDGETS(int j, bool recountVars=TRUE) if recountVars GET_NEW_START_VALUES(j) ENDIF initResourceWidget() initTriggerWidget() initScenarioWidget() ENDPROC proc manageResources() int j int ii MODEL_NAMES aModel ped_index aPed string sTemp float Ft float ftemp if bAddResource bAddResource = FALSE resource[iResourceCount].menuType = 0 iResourceCount++ REBUILD_WIDGETS(iResourceCount-1) //GET_NEW_START_VALUES(iResourceCount-1) //initResourceWidget() ENDIF if bAddTrigger bAddTrigger = FALSE resource[iResourceCount].menuType = 1 resource[iResourceCount].type = 100 iResourceCount++ //GET_NEW_START_VALUES(iResourceCount-1) //initTriggerWidget() REBUILD_WIDGETS(iResourceCount-1) ENDIF if bAddToScenario bAddToScenario = FALSE resource[iResourceCount].menuType = 2 resource[iResourceCount].type = 200 iResourceCount++ //GET_NEW_START_VALUES(iResourceCount-1) //initScenarioWidget() REBUILD_WIDGETS(iResourceCount-1) ENDIF vector vPlot, vNewPlot bool bMakeChange = FALSE VEHICLE_INDEX thisveh for j = 0 to iResourceCount-1 if (resource[j].menuType = 0 and resource[j].type != i[resource[j].varStart.startI]) or (resource[j].menuType = 1 and resource[j].type-100 != i[resource[j].varStart.startI]) or (resource[j].menuType = 2 and resource[j].type-200 != i[resource[j].varStart.startI]) //type PRINTLN("******************************************************************************") PRINTLN("change in widget type for j = ",j) PRINTLN("Stored j type = ",resource[j].type," i[resource[j].varStart.startI] = ",i[resource[j].varStart.startI]," where resource[j].varStart.startI = ",resource[j].varStart.startI) if resource[j].menuType = 0 resource[j].type = i[resource[j].varStart.startI] ENDIF if resource[j].menuType = 1 resource[j].type = i[resource[j].varStart.startI]+100 ENDIF if resource[j].menuType = 2 resource[j].type = i[resource[j].varStart.startI]+200 ENDIF AMEND_VAR_ENTRIES(j) //update widget and variable entries bMakeChange = TRUE ENDIF switch resource[j].type case 1 //vehicle if DOES_TEXT_WIDGET_EXIST(tw[resource[j].varStart.startTw]) if not Is_String_Null_Or_Empty(GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) if IS_STRING_A_VEHICLE_MODEL(GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) if mod[resource[j].varStart.startMod] = DUMMY_MODEL_FOR_SCRIPT set_model_for_Vehicle(mod[resource[j].varStart.startMod],GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) REQUEST_MODEL(mod[resource[j].varStart.startMod]) ELSE if not are_strings_equal(GET_MODEL_NAME_FOR_DEBUG(mod[resource[j].varStart.startMod]),GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) set_model_for_Vehicle(mod[resource[j].varStart.startMod],GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) REQUEST_MODEL(mod[resource[j].varStart.startMod]) ENDIF ENDIF ENDIF ENDIF ENDIF //check spawn vehicle if b[resource[j].varStart.startB] = TRUE b[resource[j].varStart.startB] = FALSE if IS_MODEL_A_VEHICLE(mod[resource[j].varStart.startMod]) if not IS_PED_INJURED(PLAYER_PED_ID()) if IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) thisveh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) if IS_VEHICLE_DRIVEABLE(thisveh) SET_ENTITY_COORDS(PLAYER_PED_ID(),GET_ENTITY_COORDS(thisveh)) DELETE_VEHICLE(thisveh) ENDIF ENDIF REQUEST_MODEL(mod[resource[j].varStart.startMod]) while not HAS_MODEL_LOADED(mod[resource[j].varStart.startMod]) PRINTLN("Loading model") WAIT(0) ENDWHILE if not IS_PED_INJURED(PLAYER_PED_ID()) i[resource[j].varStart.startI+1] = native_to_int(CREATE_VEHICLE(mod[resource[j].varStart.startMod],GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0.0,0.0,1.0>>)) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(),INT_TO_NATIVE(VEHICLE_INDEX,i[resource[j].varStart.startI+1])) ENDIF ENDIF ENDIF ENDIF BREAK case 2 //ped /* if DOES_TEXT_WIDGET_EXIST(tw[resource[j].varStart.startTw]) if not Is_String_Null_Or_Empty(GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) if IS_STRING_A_PED(GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) if mod[resource[j].varStart.startMod] = DUMMY_MODEL_FOR_SCRIPT set_model_for_Vehicle(mod[resource[j].varStart.startMod],GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) REQUEST_MODEL(mod[resource[j].varStart.startMod]) ELSE if not are_strings_equal(GET_MODEL_NAME_FOR_DEBUG(mod[resource[j].varStart.startMod]),GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) set_model_for_Vehicle(mod[resource[j].varStart.startMod],GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) REQUEST_MODEL(mod[resource[j].varStart.startMod]) ENDIF ENDIF ENDIF ENDIF ENDIF*/ if DOES_TEXT_WIDGET_EXIST(tw[resource[j].varStart.startTw]) if not Is_String_Null_Or_Empty(GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) GET_MODEL_FOR_PED(aModel,GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) if IS_MODEL_A_PED(aModel) if mod[resource[j].varStart.startMod] = DUMMY_MODEL_FOR_SCRIPT mod[resource[j].varStart.startMod] = aModel REQUEST_MODEL(aModel) ELSE if not are_strings_equal(GET_MODEL_NAME_FOR_DEBUG(mod[resource[j].varStart.startMod]),GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) mod[resource[j].varStart.startMod] = aModel REQUEST_MODEL(aModel) ENDIF ENDIF ENDIF ENDIF ENDIF //check spawn vehicle if b[resource[j].varStart.startB] = TRUE b[resource[j].varStart.startB] = FALSE aPed = INT_TO_NATIVE(ped_index,i[resource[j].varStart.startI+1]) if DOES_ENTITY_EXIST(aPed) SET_MODEL_AS_NO_LONGER_NEEDED(GET_ENTITY_MODEL(aPed)) DELETE_PED(aPed) ENDIF if GET_MODEL_FOR_PED(aModel,GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) REQUEST_MODEL(aModel) while not HAS_MODEL_LOADED(aModel) WAIT(0) PRINTLN("Loading model b") ENDWHILE if not IS_PED_INJURED(PLAYER_PED_ID()) aPed = CREATE_PED(pedtype_mission,aModel,GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(),<<0.0,2.0,0.0>>)) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(aPed,TRUE) i[resource[j].varStart.startI+1] = NATIVE_TO_INT(aPed) ENDIF ENDIF ENDIF BREAK case 3 //force if b[resource[j].varStart.startB+3] = TRUE if i[resource[j].varStart.startI+3] = 0 i[resource[j].varStart.startI+3] = i[resource[j].varStart.startI+2] + GET_GAME_TIMER() ENDIF if GET_GAME_TIMER()<=i[resource[j].varStart.startI+3] if not IS_PED_INJURED(PLAYER_PED_ID()) if IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) thisveh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) if IS_VEHICLE_DRIVEABLE(thisveh) APPLY_FORCE_TO_ENTITY(thisveh,INT_TO_ENUM(APPLY_FORCE_TYPE,i[resource[j].varStart.startI+1]),v[resource[j].varStart.startv],v[resource[j].varStart.startv+1],0,b[resource[j].varStart.startb],b[resource[j].varStart.startb+1],b[resource[j].varStart.startb+2]) ENDIF ELSE APPLY_FORCE_TO_ENTITY(PLAYER_PED_ID(),INT_TO_ENUM(APPLY_FORCE_TYPE,i[resource[j].varStart.startI+1]),v[resource[j].varStart.startv],v[resource[j].varStart.startv+1],0,b[resource[j].varStart.startb],b[resource[j].varStart.startb+1],b[resource[j].varStart.startb+2]) ENDIF ENDIF ELSE b[resource[j].varStart.startB+3] = FALSE i[resource[j].varStart.startI+3] = 0 ENDIF ENDIF BREAK case 4 //damage if b[resource[j].varStart.startB] = TRUE b[resource[j].varStart.startB] = FALSE if not IS_PED_INJURED(PLAYER_PED_ID()) if IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) thisveh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) if IS_VEHICLE_DRIVEABLE(thisveh) SET_VEHICLE_DAMAGE(thisveh,v[resource[j].varStart.startV],f[resource[j].varStart.startf],f[resource[j].varStart.startf+1],b[resource[j].varStart.startB+1]) ENDIF ENDIF ENDIF ENDIF BREAK CASE 5 //bezier if i[resource[j].varStart.startI+1] != i[resource[j].varStart.startI+2] //stored no of points != no of points in widget i[resource[j].varStart.startI+2] = i[resource[j].varStart.startI+1] REBUILD_WIDGETS(j) ENDIF if b[resource[j].varStart.startB] //draw bez line SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(true) for ii = 0 to i[resource[j].varStart.startI+1]-1 DRAW_DEBUG_BOX(v[resource[j].varStart.startV+(ii*3)]-<<0.5,0.5,0.5>>,v[resource[j].varStart.startV+(ii*3)]+<<0.5,0.5,0.5>>,255,0,0,128) DRAW_DEBUG_BOX(v[resource[j].varStart.startV+(ii*3)]+v[resource[j].varStart.startV+1+(ii*3)]-<<0.35,0.35,0.35>>,v[resource[j].varStart.startV+(ii*3)]+v[resource[j].varStart.startV+1+(ii*3)]+<<0.35,0.35,0.35>>,255,255,0,128) DRAW_DEBUG_LINE(v[resource[j].varStart.startV+(ii*3)],v[resource[j].varStart.startV+(ii*3)]+v[resource[j].varStart.startV+1+(ii*3)],255,0,255,80) if i[resource[j].varStart.startI+1] > 1 and ii < i[resource[j].varStart.startI+1]-1 getBezCoord(j,ii,0,vPlot) // getBezCoord(resource[j].varStart.startV,ii,0,vPlot) ft = 0.1 while ft <= 0.95 getBezCoord(j,ii,ft,vNewPlot) DRAW_DEBUG_LINE(vplot,vnewplot,0,0,255,128) vplot=vnewplot ft+= 0.1 ENDWHILE DRAW_DEBUG_LINE(vplot,v[resource[j].varStart.startV+(ii*3)+3],0,0,255,128) ENDIF ENDFOR ENDIF if b[resource[j].varStart.startB+1] b[resource[j].varStart.startB+1] = FALSE v[resource[j].varStart.startV+(i[resource[j].varStart.startI+3]*3)] = GET_CAM_COORD(GET_DEBUG_CAM()) v[resource[j].varStart.startV+2+(i[resource[j].varStart.startI+3]*3)] = GET_CAM_ROT(GET_DEBUG_CAM()) ENDIF if b[resource[j].varStart.startB+2] b[resource[j].varStart.startB+2] = FALSE v[resource[j].varStart.startV+1+(i[resource[j].varStart.startI+3]*3)] = GET_CAM_COORD(GET_DEBUG_CAM()) - v[resource[j].varStart.startV+(i[resource[j].varStart.startI+3]*3)] ENDIF BREAK case 7 //veh recording if DOES_TEXT_WIDGET_EXIST(tw[resource[j].varStart.startTw]) if Is_String_Null_Or_Empty(sVehRecording) sVehRecording = GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw]) ELSE if not ARE_STRINGS_EQUAL(sVehRecording,GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) sVehRecording = null ENDIF ENDIF if b[resource[j].varStart.startB] = TRUE //trigger recording //b[resource[j].varStart.startB] = FALSE if IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) thisveh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) if IS_VEHICLE_DRIVEABLE(thisveh) if not IS_PLAYBACK_GOING_ON_FOR_VEHICLE(thisveh) if DOES_VEHICLE_RECORDING_FILE_EXIST_IN_CDIMAGE(i[resource[j].varStart.startI+1],GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) REQUEST_VEHICLE_RECORDING(i[resource[j].varStart.startI+1],GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) while not HAS_VEHICLE_RECORDING_BEEN_LOADED(i[resource[j].varStart.startI+1],GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) REQUEST_VEHICLE_RECORDING(i[resource[j].varStart.startI+1],GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) PRINTLN("has veh rec loaded ",i[resource[j].varStart.startI+1],GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) WAIT(0) ENDWHILE if IS_VEHICLE_DRIVEABLE(thisveh) START_PLAYBACK_RECORDED_VEHICLE(thisveh,i[resource[j].varStart.startI+1],GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw])) ENDIF ENDIF ENDIF ENDIF ENDIF ELSE if IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) thisveh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) if IS_VEHICLE_DRIVEABLE(thisveh) if IS_PLAYBACK_GOING_ON_FOR_VEHICLE(thisveh) STOP_PLAYBACK_RECORDED_VEHICLE(thisveh) ENDIF ENDIF ENDIF ENDIF ENDIF BREAK case 8 if i[resource[j].varStart.startI+1] != i[resource[j].varStart.startI+2] i[resource[j].varStart.startI+2] = i[resource[j].varStart.startI+1] tempModel = INT_TO_ENUM(model_names,i[resource[j].varStart.startI+1]) if IS_MODEL_IN_CDIMAGE(tempModel) REQUEST_MODEL(tempModel) while not HAS_MODEL_LOADED(tempModel) PRINTLN("Load model") REQUEST_MODEL(tempModel) WAIT(0) ENDWHILE ENDIF ENDIF if b[resource[j].varStart.startB] b[resource[j].varStart.startB]=FALSE tempModel = INT_TO_ENUM(model_names,i[resource[j].varStart.startI+1]) if IS_MODEL_IN_CDIMAGE(tempModel) if HAS_MODEL_LOADED(tempModel) if not IS_PED_INJURED(player_ped_id()) if DOES_ENTITY_EXIST(INT_TO_NATIVE(object_index,i[resource[j].varStart.startI+3])) tempObj = INT_TO_NATIVE(object_index,i[resource[j].varStart.startI+3]) DELETE_OBJECT(tempObj) ENDIF i[resource[j].varStart.startI+3] = native_to_int(CREATE_OBJECT(tempModel,GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(),<<0.0,1.5,0.0>>))) ENDIF ENDIF ENDIF ENDIF BREAK case 9 //cams if i[resource[j].varStart.startI+1] != i[resource[j].varStart.startI+2] //stored no of points != no of points in widget i[resource[j].varStart.startI+2] = i[resource[j].varStart.startI+1] REBUILD_WIDGETS(j) ENDIF if i[resource[j].varStart.startI+1] = 0 //static if b[resource[j].varStart.startB+1] //position to debug b[resource[j].varStart.startB+1] = FALSE v[resource[j].varStart.startV] = GET_CAM_COORD(GET_DEBUG_CAM()) v[resource[j].varStart.startV+1] = GET_CAM_ROT(GET_DEBUG_CAM()) ENDIF ELIF i[resource[j].varStart.startI+1] = 1 //pan if b[resource[j].varStart.startB+1] //position to debug b[resource[j].varStart.startB+1] = FALSE v[resource[j].varStart.startV] = GET_CAM_COORD(GET_DEBUG_CAM()) v[resource[j].varStart.startV+1] = GET_CAM_ROT(GET_DEBUG_CAM()) ENDIF if b[resource[j].varStart.startB+2] //position to debug b[resource[j].varStart.startB+2] = FALSE v[resource[j].varStart.startV+2] = GET_CAM_COORD(GET_DEBUG_CAM()) v[resource[j].varStart.startV+3] = GET_CAM_ROT(GET_DEBUG_CAM()) ENDIF ENDIF if b[resource[j].varStart.startB] = TRUE if not DOES_CAM_EXIST(aCam) aCam = CREATE_CAMERA() iCamTime = GET_GAME_TIMER()+ i[resource[j].varStart.startI+3] if i[resource[j].varStart.startI+1] = 0 //static SET_CAM_COORD(aCam,v[resource[j].varStart.startV]) SET_CAM_ROT(aCam,v[resource[j].varStart.startV+1]) SET_CAM_ACTIVE(aCam,true) ELIF i[resource[j].varStart.startI+1] = 1 //pan bCam = CREATE_CAMERA() SET_CAM_COORD(aCam,v[resource[j].varStart.startV]) SET_CAM_ROT(aCam,v[resource[j].varStart.startV+1]) SET_CAM_COORD(bCam,v[resource[j].varStart.startV+2]) SET_CAM_ROT(bCam,v[resource[j].varStart.startV+3]) SET_CAM_ACTIVE_WITH_INTERP(bCam,acam,i[resource[j].varStart.startI+3]) ELIF i[resource[j].varStart.startI+1] = 2 //bezier itempb=0 for itemp = 0 to COUNT_OF(resource)-1 if resource[itemp].type = 5 //bezier if itempb = i[resource[j].varStart.startI+4] i[resource[j].varStart.startI+5] = itemp itemp = COUNT_OF(resource) ELSE itempb++ ENDIF ENDIF ENDFOR itemp = i[resource[j].varStart.startI+5] SET_CAM_COORD(aCam,v[resource[itemp].varStart.startV]) SET_CAM_ROT(aCam,v[resource[itemp].varStart.startV+1]) SET_CAM_ACTIVE(aCam,true) ENDIF RENDER_SCRIPT_CAMS(true,FALSE) ENDIF if GET_GAME_TIMER() < iCamTime if i[resource[j].varStart.startI+1] = 2 //bezier useBezier(i[resource[j].varStart.startI+5],GET_GAME_TIMER() - (iCamTime - i[resource[j].varStart.startI+3]),i[resource[j].varStart.startI+3],vTemp,vTempB) //itemp = currentTime //itemp = //3 = total duration //ftemp = to_float(itemp)/(TO_FLOAT(i[resource[j].varStart.startI+3])/TO_FLOAT(i[resource[itempb].varStart.startI+1]-1)) //itemp = FLOOR(ftemp) SET_CAM_COORD(aCam,vTemp) SET_CAM_ROT(aCam,vTempb) ENDIF ELSE RENDER_SCRIPT_CAMS(FALSE,FALSE) SET_CAM_ACTIVE(aCam,FALSE) DESTROY_CAM(aCam) if DOES_CAM_EXIST(bCam) DESTROY_CAM(bCam) ENDIF b[resource[j].varStart.startB] = FALSE ENDIF ELSE if DOES_CAM_EXIST(aCam) RENDER_SCRIPT_CAMS(FALSE,FALSE) SET_CAM_ACTIVE(aCam,FALSE) DESTROY_CAM(aCam) if DOES_CAM_EXIST(bCam) DESTROY_CAM(bCam) ENDIF ENDIF ENDIF break case 10 //anim dictFget //load anim dict if required if DOES_TEXT_WIDGET_EXIST(tw[resource[j].varStart.startTw]) stemp = GET_CONTENTS_OF_TEXT_WIDGET(tw[resource[j].varStart.startTw]) if not Is_String_Null_Or_Empty(stemp) if not HAS_ANIM_DICT_LOADED(stemp) REQUEST_ANIM_DICT(stemp) PRINTLN("************************ request anim dict ",stemp," **************************************") ENDIF ENDIF ENDIF BREAK case 100 //Triggers BREAK case 101 //entity in area if b[resource[j].varStart.startB] = TRUE b[resource[j].varStart.startB] = FALSE if not IS_PED_INJURED(PLAYER_PED_ID()) v[resource[j].varStart.startV] = GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0.0,0.0,1.0>> ENDIF ENDIF if b[resource[j].varStart.startB+1] = TRUE SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) ftemp = f[resource[j].varStart.startF] DRAW_DEBUG_BOX(v[resource[j].varStart.startV]-<>,v[resource[j].varStart.startV]+<>,0,0,255,100) ENDIF BREAK case 201 //ped actions if i[resource[j].varStart.startI+4] != i[resource[j].varStart.startI+5] i[resource[j].varStart.startI+5] = i[resource[j].varStart.startI+4] REBUILD_WIDGETS(j) ENDIF if i[resource[j].varStart.startI+4] = 0 //spawn if b[resource[j].varStart.startB] //set coords from player b[resource[j].varStart.startB] = FALSE if not IS_PED_INJURED(PLAYER_PED_ID()) v[resource[j].varStart.startV] = GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0.0,0.0,1.0>> f[resource[j].varStart.startF] = GET_ENTITY_HEADING(PLAYER_PED_ID()) ENDIF ENDIF ELIF i[resource[j].varStart.startI+4] = 1 //go to coord if b[resource[j].varStart.startB] //set coords from player b[resource[j].varStart.startB] = FALSE if not IS_PED_INJURED(PLAYER_PED_ID()) v[resource[j].varStart.startV] = GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0.0,0.0,1.0>> f[resource[j].varStart.startF] = GET_ENTITY_HEADING(PLAYER_PED_ID()) ENDIF ENDIF ENDIF BREAK /* case 201 //create ped and give actions //trigger addint(i[resource[iEntry].varStart.startI+2],"Trigger (-1 = on Start)",-1,30,1) //action addint(i[resource[iEntry].varStart.startI+3],"Ped to use",0,20,1) addWidgetCombo(i[resource[iEntry].varStart.startI+4],"Action","Spawn","Go to coord") addIntStorage() //store previous state of above if i[resource[iEntry].varStart.startI+4] = 0 //spawn addBool(b[resource[iEntry].varStart.startB],"Set spawn pos from player") addVector(v[resource[iEntry].varStart.startV],"Spawn pos",-8000.0,8000.0,0.1) addFloat(f[resource[iEntry].varStart.startF],"Heading",-180.0,180.0,0.1) ELIF i[resource[iEntry].varStart.startI+4] = 1 //go to coord addVector(v[resource[iEntry].varStart.startV],"Go to coord",-8000.0,8000.0,0.1) addWidgetCombo(i[resource[iEntry].varStart.startI+6],"Speed","Walk","Run","Sprint") ENDIF BREAK */ case 202 //anims if b[resource[j].varStart.startB+1] b[resource[j].varStart.startB+1]=FALSE i[resource[j].varStart.startI+5]++ REBUILD_WIDGETS(j) //if i[resource[j].varStart.startI+6] != 0 // if not IS_BIT_set(i[resource[j].varStart.startI+5],i[resource[j].varStart.startI+6]) // SET_BIT(i[resource[j].varStart.startI+5],i[resource[j].varStart.startI+6]) // INSERT_RESOURCE_INT_ENTRY(j) // ENDIF ENDIF BREAK case 203 //veh actions if i[resource[j].varStart.startI+4] != i[resource[j].varStart.startI+5] //stored no of points != no of points in widget i[resource[j].varStart.startI+5] = i[resource[j].varStart.startI+4] REBUILD_WIDGETS(j) ENDIF if i[resource[j].varStart.startI+4] = 0 //spawn if b[resource[j].varStart.startB] //set coords from player b[resource[j].varStart.startB] = FALSE if not IS_PED_INJURED(PLAYER_PED_ID()) v[resource[j].varStart.startV] = GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0.0,0.0,1.0>> ENDIF ENDIF ELIF i[resource[j].varStart.startI+4] = 1 //veh rec if not Is_String_Null_Or_Empty(sVehRecording) if i[resource[j].varStart.startI+6] != i[resource[j].varStart.startI+7] if i[resource[j].varStart.startI+7] != 0 if DOES_VEHICLE_RECORDING_FILE_EXIST_IN_CDIMAGE(i[resource[j].varStart.startI+7],sVehRecording) REMOVE_VEHICLE_RECORDING(i[resource[j].varStart.startI+7],sVehRecording) ENDIF ENDIF if DOES_VEHICLE_RECORDING_FILE_EXIST_IN_CDIMAGE(i[resource[j].varStart.startI+6],sVehRecording) REQUEST_VEHICLE_RECORDING(i[resource[j].varStart.startI+6],sVehRecording) while not HAS_VEHICLE_RECORDING_BEEN_LOADED(i[resource[j].varStart.startI+6],sVehRecording) PRINTLN("has veh rec loaded b") WAIT(0) ENDWHILE ENDIF i[resource[j].varStart.startI+7] = i[resource[j].varStart.startI+6] ENDIF ENDIF ENDIF BREAK ENDSWITCH ENDFOR if bMakeChange = TRUE initResourceWidget() initTriggerWidget() initScenarioWidget() PRINTLN("finished revising widgets") PRINTLN("i[1] = ",i[1]) PRINTLN("------------------------------------------------------------------------------") ENDIF ENDPROC PROC loadData() bool bReachedTw=FALSE int j, eachNode filename = path filename += sfilename filename += ".xml" LOAD_XML_FILE(filename) iResourceCount=0 vCount=0 iCount=0 fCount=0 modCount=0 twCount=0 bCount=0 IF GET_NUMBER_OF_XML_NODES() <> 0 FOR eachNode = 0 TO (GET_NUMBER_OF_XML_NODES()-1) if are_strings_equal(GET_XML_NODE_NAME(),"PlayerCoord") FOR j = 0 to GET_NUMBER_OF_XML_NODE_ATTRIBUTES()-1 SWITCH GET_HASH_KEY(GET_XML_NODE_ATTRIBUTE_NAME(j)) case HASH_vX vTemp.x = GET_float_FROM_XML_NODE_ATTRIBUTE(j) break case HASH_vY vTemp.y = GET_float_FROM_XML_NODE_ATTRIBUTE(j) break case HASH_vZ vTemp.z = GET_float_FROM_XML_NODE_ATTRIBUTE(j) break ENDSWITCH ENDFOR if not IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(),vTemp) ENDIF ENDIF if are_strings_equal(GET_XML_NODE_NAME(),"Resource") PRINTLN("loadresource") FOR j = 0 to GET_NUMBER_OF_XML_NODE_ATTRIBUTES()-1 SWITCH GET_HASH_KEY(GET_XML_NODE_ATTRIBUTE_NAME(j)) case HASH_menuType resource[iResourceCount].menuType = GET_INT_FROM_XML_NODE_ATTRIBUTE(j) break case HASH_subType resource[iResourceCount].type = GET_INT_FROM_XML_NODE_ATTRIBUTE(j) break case HASH_startV resource[iResourceCount].varStart.startV = GET_INT_FROM_XML_NODE_ATTRIBUTE(j) break case HASH_startF resource[iResourceCount].varStart.startF = GET_INT_FROM_XML_NODE_ATTRIBUTE(j) PRINTLN("Load data: resource[",iResourceCount,"].varStart.startF = ",resource[iResourceCount].varStart.startF) break case HASH_startI resource[iResourceCount].varStart.startI = GET_INT_FROM_XML_NODE_ATTRIBUTE(j) break case HASH_startB resource[iResourceCount].varStart.startB = GET_INT_FROM_XML_NODE_ATTRIBUTE(j) break CASE HASH_startTw resource[iResourceCount].varStart.startTw = GET_INT_FROM_XML_NODE_ATTRIBUTE(j) BREAK case HASH_startMod resource[iResourceCount].varStart.startMod = GET_INT_FROM_XML_NODE_ATTRIBUTE(j) BREAK ENDSWITCH ENDFOR iResourceCount++ ENDIF if are_strings_equal(GET_XML_NODE_NAME(),"saveVector") PRINTLN("loadvector") FOR j = 0 to GET_NUMBER_OF_XML_NODE_ATTRIBUTES()-1 SWITCH GET_HASH_KEY(GET_XML_NODE_ATTRIBUTE_NAME(j)) case HASH_vX v[vCount].x = GET_float_FROM_XML_NODE_ATTRIBUTE(j) break case HASH_vY v[vCount].y = GET_float_FROM_XML_NODE_ATTRIBUTE(j) break case HASH_vZ v[vCount].z = GET_float_FROM_XML_NODE_ATTRIBUTE(j) break ENDSWITCH ENDFOR vCount++ ENDIF if are_strings_equal(GET_XML_NODE_NAME(),"saveFloat") PRINTLN("loadfloat") FOR j = 0 to GET_NUMBER_OF_XML_NODE_ATTRIBUTES()-1 SWITCH GET_HASH_KEY(GET_XML_NODE_ATTRIBUTE_NAME(j)) case HASH_f f[fCount] = GET_float_FROM_XML_NODE_ATTRIBUTE(j) PRINTLN("f[",fCount,"] = ",f[fCount]) break ENDSWITCH ENDFOR fCount++ ENDIF if are_strings_equal(GET_XML_NODE_NAME(),"saveInt") PRINTLN("loadint") FOR j = 0 to GET_NUMBER_OF_XML_NODE_ATTRIBUTES()-1 SWITCH GET_HASH_KEY(GET_XML_NODE_ATTRIBUTE_NAME(j)) case HASH_i i[iCount] = GET_int_FROM_XML_NODE_ATTRIBUTE(j) break ENDSWITCH ENDFOR iCount++ ENDIF if are_strings_equal(GET_XML_NODE_NAME(),"saveBool") PRINTLN("loadbool") FOR j = 0 to GET_NUMBER_OF_XML_NODE_ATTRIBUTES()-1 SWITCH GET_HASH_KEY(GET_XML_NODE_ATTRIBUTE_NAME(j)) case HASH_b b[bCount] = GET_bool_FROM_XML_NODE_ATTRIBUTE(j) break ENDSWITCH ENDFOR bCount++ ENDIF /* if are_strings_equal(GET_XML_NODE_NAME(),"saveTw") FOR j = 0 to GET_NUMBER_OF_XML_NODE_ATTRIBUTES()-1 SWITCH GET_HASH_KEY(GET_XML_NODE_ATTRIBUTE_NAME(j)) case HASH_tw tw[twCount] = GET_bool_FROM_XML_NODE_ATTRIBUTE(j) break ENDSWITCH ENDFOR twCount++ ENDIF */ if are_strings_equal(GET_XML_NODE_NAME(),"saveMod") PRINTLN("loadMod") FOR j = 0 to GET_NUMBER_OF_XML_NODE_ATTRIBUTES()-1 SWITCH GET_HASH_KEY(GET_XML_NODE_ATTRIBUTE_NAME(j)) case HASH_mod itemp = GET_int_FROM_XML_NODE_ATTRIBUTE(j) mod[modCount] = INT_TO_ENUM(model_names,itemp) break ENDSWITCH ENDFOR modCount++ ENDIF if are_strings_equal(GET_XML_NODE_NAME(),"saveTw") PRINTLN("Loading text widget data") if breachedtw = FALSE breachedtw=TRUE if DOES_WIDGET_GROUP_EXIST(resourceWidget) DELETE_WIDGET_GROUP(resourceWidget) ENDIF if DOES_WIDGET_GROUP_EXIST(TriggerWidget) DELETE_WIDGET_GROUP(TriggerWidget) ENDIF if DOES_WIDGET_GROUP_EXIST(scenarioWidget) DELETE_WIDGET_GROUP(scenarioWidget) ENDIF REBUILD_WIDGETS(iResourceCount-1) twCount=0 ENDIF FOR j = 0 to GET_NUMBER_OF_XML_NODE_ATTRIBUTES()-1 SWITCH GET_HASH_KEY(GET_XML_NODE_ATTRIBUTE_NAME(j)) case HASH_tw //tempstring = GET_string_FROM_XML_NODE_ATTRIBUTE(j) tempTl = GET_string_FROM_XML_NODE_ATTRIBUTE(j) if DOES_TEXT_WIDGET_EXIST(tw[twCount]) PRINTLN("tw[",twCount,"]=",tempTl) SET_CONTENTS_OF_TEXT_WIDGET(tw[twCount],tempTl) ENDIF break ENDSWITCH ENDFOR twCount++ ENDIF if eachNode < GET_NUMBER_OF_XML_NODES()-1 GET_NEXT_XML_NODE() ENDIF ENDFOR ENDIF DELETE_XML_FILE() ENDPROC proc checkLoadData() if bLoadData loadData() bLoadData = FALSE ENDIF ENDPROC proc debug() int j j=j if bDebug = TRUE for j = 0 to 10 showIntOnScreen(0.1,0.1+(j*0.03),resource[j].varStart.startV,"startv ") showIntOnScreen(0.25,0.1+(j*0.03),resource[j].varStart.starti,"starti ") showIntOnScreen(0.4,0.1+(j*0.03),resource[j].varStart.startf,"startf ") showIntOnScreen(0.55,0.1+(j*0.03),resource[j].varStart.startB,"startb ") showIntOnScreen(0.7,0.1+(j*0.03),resource[j].varStart.startTw,"starttw ") //for j = 0 to iResourceCount-1 //ENDFOR ENDFOR ENDIF ENDPROC proc sceneBuilder() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) manageResources() playbackScenario() CHECK_EXIT_SCRIPT() checkSaveData() checkLoadData() debug() ENDIF ENDPROC #ENDIF