2023-01-29 22:57:04 +01:00
# include "scriptthread.h"
# include "scriptmaster.h"
2023-01-30 18:20:50 +01:00
# include "scriptclass.h"
2023-01-29 22:57:04 +01:00
# include "scriptvariable.h"
2023-04-29 21:56:38 +02:00
# include "scriptexception.h"
2023-01-29 22:57:04 +01:00
2023-04-29 21:56:38 +02:00
# include "g_spawn.h"
2023-01-29 22:57:04 +01:00
# include "level.h"
# include "game.h"
# include "camera.h"
# include "dm_manager.h"
# include "hud.h"
# include "huddraw.h"
# include "object.h"
# include "weaputils.h"
# include "consoleevent.h"
# include "player.h"
# include "lightstyleclass.h"
# include "scriptflags.h"
# include "slre.h"
# include <md5.h>
# ifdef WIN32
# include <direct.h>
# else
# include <sys/stat.h>
# include <unistd.h>
# endif
# define scriptfiles sv_scriptfiles
2023-01-30 00:50:21 +01:00
Event EV_ScriptThread_CancelWaiting
(
" _cancelwaiting " ,
EV_CODEONLY ,
NULL ,
NULL ,
" internal event "
) ;
2023-01-29 22:57:04 +01:00
Event EV_ScriptThread_Abs
(
" abs " ,
EV_DEFAULT ,
" f " ,
" arg " ,
" Absolute value of int or float " ,
EV_RETURN
) ;
Event EV_ScriptThread_AddObjective
(
" addobjective " ,
EV_DEFAULT ,
" iisv " ,
" objective_number status text location " ,
" Adds/Changes an Objective "
) ;
Event EV_ScriptThread_ClearObjectivePos
(
" clear_objective_pos " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Clears the position of the current objective, for when you don't have one "
) ;
Event EV_ScriptThread_SetCurrentObjective
(
" setcurrentobjective " ,
EV_DEFAULT ,
" i " ,
" objective_number " ,
" Sets the specified objective as the current objective "
) ;
Event EV_ScriptThread_SetObjectivePos
(
" set_objective_pos " ,
EV_DEFAULT ,
" v " ,
" pos " ,
" Sets the position in the world of the current objective "
) ;
Event EV_ScriptThread_AllAIOff
(
" all_ai_off " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Turns all AI off. "
) ;
Event EV_ScriptThread_AllAIOn
(
" all_ai_on " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Turns all AI on. "
) ;
Event EV_ScriptThread_TeamWin
(
" teamwin " ,
EV_DEFAULT ,
" s " ,
" axis_or_allies " ,
" Sets that the 'axis' or the 'allies' have won the map. "
) ;
Event EV_ScriptThread_AnglesPointAt
(
" angles_pointat " ,
EV_DEFAULT ,
" eee " ,
" parent_entity entity target_entity " ,
" Returns the angles that points at the target_entity given the base orientation of the parent_entity and the position of the entity. " ,
EV_RETURN
) ;
Event EV_ScriptThread_AnglesToForward
(
" angles_toforward " ,
EV_DEFAULT ,
" v " ,
" angles " ,
" Returns the forward vector of the specified angles " ,
EV_RETURN
) ;
Event EV_ScriptThread_AnglesToLeft
(
" angles_toleft " ,
EV_DEFAULT ,
" v " ,
" angles " ,
" Returns the left vector of the specified angles " ,
EV_RETURN
) ;
Event EV_ScriptThread_AnglesToUp
(
" angles_toup " ,
EV_DEFAULT ,
" v " ,
" angles " ,
" Returns the up vector of the specified angles " ,
EV_RETURN
) ;
Event EV_ScriptThread_Assert
(
" assert " ,
EV_DEFAULT ,
" f " ,
" value " ,
" Assert if value is 0. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_CastBoolean
(
" bool " ,
EV_DEFAULT ,
" i " ,
" value " ,
" Casts value to a bool. " ,
EV_RETURN
) ;
Event EV_ScriptThread_CastEntity
(
" entity " ,
EV_DEFAULT ,
" i " ,
" value " ,
" Casts value to an entity. " ,
EV_RETURN
) ;
Event EV_ScriptThread_CastFloat
(
" float " ,
EV_DEFAULT ,
" i " ,
" value " ,
" Casts value to a float. " ,
EV_RETURN
) ;
Event EV_ScriptThread_CastInt
(
" int " ,
EV_DEFAULT ,
" i " ,
" value " ,
" Casts value to an int. " ,
EV_RETURN
) ;
Event EV_ScriptThread_CastString
(
" string " ,
EV_DEFAULT ,
" i " ,
" value " ,
" Casts value to a string. " ,
EV_RETURN
) ;
Event EV_ScriptThread_CreateListener
(
" CreateListener " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Creates a Listener instance. " ,
EV_RETURN
) ;
Event EV_ScriptThread_End
(
" end " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Ends the script " ,
EV_NORMAL
) ;
Event EV_ScriptThread_Timeout
(
" timeout " ,
EV_DEFAULT ,
" f " ,
" time " ,
" specifies script timeout time " ,
EV_NORMAL
) ;
Event EV_ScriptThread_Error
(
" error " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Ends the script " ,
EV_NORMAL
) ;
Event EV_ScriptThread_ForceMusic
(
" forcemusic " ,
EV_DEFAULT ,
" sS " ,
" current fallback " ,
" Forces the current and fallback (optional) music moods. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_GetSelf
(
" self " ,
EV_DEFAULT ,
NULL ,
NULL ,
" self " ,
EV_GETTER
) ;
Event EV_ScriptThread_Goto
(
" goto " ,
EV_DEFAULT ,
" s " ,
" label " ,
" Goes to the specified label. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_IPrintln
(
" iprintln " ,
EV_DEFAULT ,
" s " ,
" string " ,
" Prints a string. followed by a newline. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_IPrintln_NoLoc
(
" iprintln_noloc " ,
EV_DEFAULT ,
" s " ,
" string " ,
" Prints a string.followed by a newline with no localization conversion. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_IPrintlnBold
(
" iprintlnbold " ,
EV_DEFAULT ,
" s " ,
" string " ,
" Prints a string.followed by a newline in a bold/important way. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_IPrintlnBold_NoLoc
(
" iprintlnbold_noloc " ,
EV_DEFAULT ,
" s " ,
" string " ,
" Prints a string.followed by a newline in a bold/important way with no localization conversion. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_MPrint
(
" mprint " ,
EV_DEFAULT ,
" s " ,
" string " ,
" Prints a string. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_MPrintln
(
" mprintln " ,
EV_DEFAULT ,
" s " ,
" string " ,
" Prints a string. followed by a newline " ,
EV_NORMAL
) ;
Event EV_ScriptThread_Print3D
(
" print3d " ,
EV_DEFAULT ,
" vfs " ,
" origin scale string " ,
" prints a string in 3D space " ,
EV_NORMAL
) ;
Event EV_ScriptThread_Print
(
" print " ,
EV_DEFAULT ,
" s " ,
" string " ,
" Prints a string. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_IsAlive
(
" isalive " ,
EV_DEFAULT ,
" e " ,
" ent " ,
" Returns true if the specified entity exists and has health > 0. " ,
EV_RETURN
) ;
Event EV_ScriptThread_Println
(
" println " ,
EV_DEFAULT ,
" s " ,
" string " ,
" Prints a string. followed by a newline. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_RandomFloat
(
" randomfloat " ,
EV_DEFAULT ,
" f " ,
" max " ,
" randomfloat " ,
EV_RETURN
) ;
Event EV_ScriptThread_RandomInt
(
" randomint " ,
EV_DEFAULT ,
" i " ,
" max " ,
" randomint " ,
EV_RETURN
) ;
Event EV_ScriptThread_RegisterCommand
(
" registercmd " ,
EV_DEFAULT ,
" ss " ,
" name label " ,
" Registers a command. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_RestoreSoundtrack
(
" restoresoundtrack " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Restores the soundtrack to the previous one. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_GetCvar
(
" getcvar " ,
EV_DEFAULT ,
" s " ,
" name " ,
" getcvar " ,
EV_RETURN
) ;
Event EV_ScriptThread_SetCvar
(
" setcvar " ,
EV_DEFAULT ,
" ss " ,
" cvar_name value " ,
" Sets the value of the specified cvar. "
) ;
Event EV_ScriptThread_Earthquake
(
" earthquake " ,
EV_DEFAULT ,
" ffff " ,
" duration magnitude no_rampup no_rampdown " ,
" Create an earthquake "
) ;
Event EV_ScriptThread_CueCamera
(
" cuecamera " ,
EV_DEFAULT ,
" eF " ,
" entity switchTime " ,
" Cue the camera. If switchTime is specified, then the camera \n "
" will switch over that length of time. "
) ;
Event EV_ScriptThread_CuePlayer
(
" cueplayer " ,
EV_DEFAULT ,
" F " ,
" switchTime " ,
" Go back to the normal camera. If switchTime is specified, \n "
" then the camera will switch over that length of time. "
) ;
Event EV_ScriptThread_FreezePlayer
(
" freezeplayer " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Freeze the player. "
) ;
Event EV_ScriptThread_ReleasePlayer
(
" releaseplayer " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Release the player. "
) ;
Event EV_ScriptThread_KillEnt
(
" killent " ,
EV_CHEAT ,
" i " ,
" ent_num " ,
" Kill the specified entity. "
) ;
Event EV_ScriptThread_KillClass
(
" killclass " ,
EV_CHEAT ,
" sI " ,
" class_name except " ,
" Kills everything in the specified class except for the specified entity (optional). "
) ;
Event EV_ScriptThread_RemoveEnt
(
" removeent " ,
EV_CHEAT ,
" i " ,
" ent_num " ,
" Removes the specified entity. "
) ;
Event EV_ScriptThread_RemoveClass
(
" removeclass " ,
EV_CHEAT ,
" sI " ,
" class_name except " ,
" Removes everything in the specified class except for the specified entity (optional). "
) ;
// client/server flow control
Event EV_ScriptThread_ServerOnly
(
" server " ,
EV_DEFAULT ,
" SSSSSS " ,
" arg1 arg2 arg3 arg4 arg5 arg6 " ,
" Server only command. "
) ;
Event EV_ScriptThread_StuffCommand
(
" stuffcmd " ,
EV_DEFAULT ,
" SSSSSS " ,
" arg1 arg2 arg3 arg4 arg5 arg6 " ,
" Server only command. "
) ;
Event EV_ScriptThread_DrawHud
(
" drawhud " ,
EV_DEFAULT ,
" i " ,
" value " ,
" Specify if hud is to be drawn "
) ;
Event EV_ScriptThread_RadiusDamage
(
" radiusdamage " ,
EV_DEFAULT ,
" viiI " ,
" origin damage radius constant_damage " ,
" radius damage at origin "
) ;
Event EV_ScriptThread_BspTransition
(
" bsptransition " ,
EV_DEFAULT ,
" s " ,
" next_map " ,
" Transitions to the next BSP. Keeps player data, and game data. "
) ;
Event EV_ScriptThread_LevelTransition
(
" leveltransition " ,
EV_DEFAULT ,
" s " ,
" next_map " ,
" Transitions to the next Level. Statistics to Map Loading, does not keep player data or game data. "
) ;
Event EV_ScriptThread_MissionTransition
(
" missiontransition " ,
EV_DEFAULT ,
" s " ,
" next_map " ,
" Transitions to the next Mission. Statistics to Main Menu, Next Level should be unlocked. "
) ;
Event EV_ScriptThread_GetBoundKey1
(
" getboundkey1 " ,
EV_DEFAULT ,
" s " ,
" keyname " ,
" return a string describing the key " ,
EV_RETURN
) ;
Event EV_ScriptThread_GetBoundKey2
(
" getboundkey2 " ,
EV_DEFAULT ,
" s " ,
" keyname " ,
" return a string describing the key " ,
EV_RETURN
) ;
Event EV_ScriptThread_LocConvertString
(
" loc_convert_string " ,
EV_DEFAULT ,
" s " ,
" in " ,
" returns a localized version of the string. " ,
EV_RETURN
) ;
Event EV_ScriptThread_SetSoundtrack
(
" soundtrack " ,
EV_DEFAULT ,
" s " ,
" soundtrack_name " ,
" Changes the soundtrack. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_Trigger
(
" trigger " ,
EV_DEFAULT ,
" s " ,
" name " ,
" Trigger the specified target or entity. "
) ;
Event EV_ScriptThread_Spawn
(
" spawn " ,
EV_DEFAULT ,
" sSSSSSSSS " ,
" entityname keyname1 value1 keyname2 value2 keyname3 value3 keyname4 value4 " ,
" Spawns an entity. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_SpawnReturn
(
" spawn " ,
EV_DEFAULT ,
" sSSSSSSSS " ,
" entityname keyname1 value1 keyname2 value2 keyname3 value3 keyname4 value4 " ,
" Spawns an entity. " ,
EV_RETURN
) ;
Event EV_ScriptThread_Map
(
" map " ,
EV_DEFAULT ,
" s " ,
" map_name " ,
" Starts the specified map. "
) ;
Event EV_ScriptThread_Trace
(
" trace " ,
EV_DEFAULT ,
" vvIVV " ,
" start end pass_entities mins maxs " ,
" Performs a Trace Line from the start to the end, returns the end or the position it hit at. " ,
EV_RETURN
) ;
Event EV_ScriptThread_SightTrace
(
" sighttrace " ,
EV_DEFAULT ,
" vvIVV " ,
" start end pass_entities mins maxs " ,
" Performs a trace line from the start to the end, returns 0 if something was hit and 1 otherwise. " ,
EV_RETURN
) ;
Event EV_ScriptThread_VectorAdd
(
" vector_add " ,
EV_DEFAULT ,
" vv " ,
" vector1 vector2 " ,
" Returns vector1 + vector2. " ,
EV_RETURN
) ;
Event EV_ScriptThread_VectorCloser
(
" vector_closer " ,
EV_DEFAULT ,
" vvv " ,
" vec_a vec_b vec_c " ,
" returns 1 if the first vector is closer than the second vector to the third vector. " ,
EV_RETURN
) ;
Event EV_ScriptThread_VectorCross
(
" vector_cross " ,
EV_DEFAULT ,
" vv " ,
" vector1 vector2 " ,
" Returns vector1 x vector2. " ,
EV_RETURN
) ;
Event EV_ScriptThread_VectorDot
(
" vector_dot " ,
EV_DEFAULT ,
" vv " ,
" vector1 vector2 " ,
" Returns vector1 * vector2. " ,
EV_RETURN
) ;
Event EV_ScriptThread_VectorLength
(
" vector_length " ,
EV_DEFAULT ,
" v " ,
" vector " ,
" Returns the length of the specified vector. " ,
EV_RETURN
) ;
Event EV_ScriptThread_VectorNormalize
(
" vector_normalize " ,
EV_DEFAULT ,
" v " ,
" vector " ,
" Returns the normalized vector of the specified vector. " ,
EV_RETURN
) ;
Event EV_ScriptThread_VectorScale
(
" vector_scale " ,
EV_DEFAULT ,
" vf " ,
" vector1 scale_factor " ,
" Returns vector1 * scale_factor. " ,
EV_RETURN
) ;
Event EV_ScriptThread_VectorSubtract
(
" vector_subtract " ,
EV_DEFAULT ,
" vv " ,
" vector1 vector2 " ,
" Returns vector1 - vector2. " ,
EV_RETURN
) ;
Event EV_ScriptThread_VectorToAngles
(
" vector_toangles " ,
EV_DEFAULT ,
" v " ,
" vector1 " ,
" Returns vector1 converted to angles. " ,
EV_RETURN
) ;
Event EV_ScriptThread_VectorWithin
(
" vector_within " ,
EV_DEFAULT ,
" vvf " ,
" position1 position2 distance " ,
" returns 1 if the two points are <= distance apart, or 0 if they are greater than distance apart. " ,
EV_RETURN
) ;
Event EV_ScriptThread_Wait
(
" wait " ,
EV_DEFAULT ,
" f " ,
" wait_time " ,
" Wait for the specified amount of time. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_WaitFrame
(
" waitframe " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Wait for one server frame. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_SetCinematic
(
" cinematic " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Turns on cinematic. "
) ;
Event EV_ScriptThread_SetNonCinematic
(
" noncinematic " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Turns off cinematic. "
) ;
//
// reborn stuff
//
Event EV_ScriptThread_CanSwitchTeams
(
" canswitchteams " ,
EV_DEFAULT ,
" bB " ,
" allow_team_change allow_spectator " ,
" Specify if players are allowed to switch teams and spectate. Override player's canswitchteams. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_RemoveArchivedClass
(
" removearchivedclass " ,
EV_DEFAULT ,
" sI " ,
" class except_entity_number " ,
" Removes all of the simple archived entities in the specified class. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_FadeSound
(
" fadesound " ,
- 1 ,
" fFE " ,
" time min_vol player " ,
" Fades the sound out over the given time, optionally to one single player. \n "
" min_vol being a 0-1 fraction is the minimum volume. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_RestoreSound
(
" restoresound " ,
- 1 ,
" fFE " ,
" time max_vol player " ,
" Fades the sound in over the given time, optionally to one single player. \n "
" max_vol being a 0-1 fraction is the maximum volume. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_Earthquake2
(
" earthquake2 " ,
EV_DEFAULT ,
" ffbbVF " ,
" duration magnitude no_rampup no_rampdown location radius " ,
" Create a smooth realistic earthquake. Requires sv_reborn to be set. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_GetPlayerNetname
(
" netname " ,
EV_DEFAULT ,
" e " ,
" player " ,
" Gets player's netname " ,
EV_RETURN
) ;
Event EV_ScriptThread_GetPlayerIP
(
" getip " ,
EV_DEFAULT ,
" e " ,
" player " ,
" Gets player's ip " ,
EV_RETURN
) ;
Event EV_ScriptThread_ServerStufftext
(
" stuffsrv " ,
EV_DEFAULT ,
" s " ,
" string " ,
" Sends command to server " ,
EV_NORMAL
) ;
Event EV_ScriptThread_GetAreaEntities
(
" getareaentities " ,
EV_DEFAULT ,
" vvv " ,
" origin mins maxs " ,
" Get all entities around the origin " ,
EV_RETURN
) ;
Event EV_ScriptThread_GetPlayerPing
(
" getping " ,
EV_DEFAULT ,
" e " ,
" player " ,
" Gets player's ping " ,
EV_RETURN
) ;
Event EV_ScriptThread_GetPlayerClientNum
(
" getclientnum " ,
EV_DEFAULT ,
" e " ,
" player " ,
" Gets player's client number " ,
EV_RETURN
) ;
Event EV_ScriptThread_HudDraw3d
(
" huddraw_3d " ,
EV_DEFAULT ,
" iviiE " ,
" index vector_or_offset always_show depth entity " ,
" Sets this huddraw element to be a 3D world icon and can specify if this icon is always shown on-screen even if the player isn't looking at. \n "
" Uses xy pos from huddraw_rect. \n "
" If entity is specified, the vector will be an offset relative to the entity. \n "
" depth specify if the icon is shown through walls. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_HudDrawTimer
(
" huddraw_timer " ,
EV_DEFAULT ,
" iff " ,
" index duration fade_out_time " ,
" Sets a timer to be displayed and fade within the given time in seconds. Clears the string value and the shader value of huddraw element. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_HudDrawAlign
(
" huddraw_align " ,
EV_DEFAULT ,
" iss " ,
" index h_align v_align " ,
" Sets the alignment of a huddraw element for given player. Specified with 'left', 'center', or 'right' " ,
EV_NORMAL
) ;
Event EV_ScriptThread_HudDrawAlpha
(
" huddraw_alpha " ,
EV_DEFAULT ,
" if " ,
" index alpha " ,
" Sets the alpha of a huddraw element for given player " ,
EV_NORMAL
) ;
Event EV_ScriptThread_HudDrawColor
(
" huddraw_color " ,
EV_DEFAULT ,
" ifff " ,
" index red green blue " ,
" Sets the color for a huddraw element for given player " ,
EV_NORMAL
) ;
Event EV_ScriptThread_HudDrawFont
(
" huddraw_font " ,
EV_DEFAULT ,
" is " ,
" index fontname " ,
" Sets the font to use for given player huddraw element " ,
EV_NORMAL
) ;
Event EV_ScriptThread_HudDrawRect
(
" huddraw_rect " ,
EV_DEFAULT ,
" iiiii " ,
" index x y width height " ,
" Specifies the position of the upper left corner and size of a huddraw element for given player " ,
EV_NORMAL
) ;
Event EV_ScriptThread_HudDrawShader
(
" huddraw_shader " ,
EV_DEFAULT ,
" is " ,
" index shader " ,
" Sets the shader to use for a particular huddraw element for given player " ,
EV_NORMAL
) ;
Event EV_ScriptThread_HudDrawString
(
" huddraw_string " ,
EV_DEFAULT ,
" is " ,
" index string " ,
" Sets a string to be displayed for given player. Clears the shader value " ,
EV_NORMAL
) ;
Event EV_ScriptThread_HudDrawVirtualSize
(
" huddraw_virtualsize " ,
EV_DEFAULT ,
" ii " ,
" index virtual " ,
" Sets if the huddraw element for given player should use virutal screen resolution for positioning and size " ,
EV_NORMAL
) ;
// Precache specific
Event EV_ScriptThread_Precache_Cache
(
" cache " ,
EV_DEFAULT ,
" s " ,
" resource_name " ,
" Cache the specified resource. "
) ;
// fades for movies
Event EV_ScriptThread_FadeIn
(
" fadein " ,
EV_DEFAULT ,
" fffffI " ,
" time red green blue alpha mode " ,
" Sets up fadein in values. "
) ;
Event EV_ScriptThread_FadeOut
(
" fadeout " ,
EV_DEFAULT ,
" fffffI " ,
" time red green blue alpha mode " ,
" Sets up fadeout values. "
) ;
Event EV_ScriptThread_CameraCommand
(
" cam " ,
EV_DEFAULT ,
" sSSSSSS " ,
" command arg1 arg2 arg3 arg4 arg5 arg6 " ,
" Processes a camera command. "
) ;
// music command
Event EV_ScriptThread_MusicEvent
(
" music " ,
EV_DEFAULT ,
" sS " ,
" current fallback " ,
" Sets the current and fallback (optional) music moods. "
) ;
Event EV_ScriptThread_ForceMusicEvent
(
" forcemusic " ,
EV_DEFAULT ,
" sS " ,
" current fallback " ,
" Forces the current and fallback (optional) music moods. "
) ;
Event EV_ScriptThread_MusicVolumeEvent
(
" musicvolume " ,
EV_DEFAULT ,
" ff " ,
" volume fade_time " ,
" Sets the volume and fade time of the music. "
) ;
Event EV_ScriptThread_RestoreMusicVolumeEvent
(
" restoremusicvolume " ,
EV_DEFAULT ,
" f " ,
" fade_time " ,
" Restores the music volume to its previous value. "
) ;
Event EV_ScriptThread_SoundtrackEvent
(
" soundtrack " ,
EV_DEFAULT ,
" s " ,
" soundtrack_name " ,
" Changes the soundtrack. "
) ;
Event EV_ScriptThread_RestoreSoundtrackEvent
(
" restoresoundtrack " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Restores the soundtrack to the previous one. "
) ;
Event EV_ScriptThread_ClearFade
(
" clearfade " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Clear the fade from the screen "
) ;
Event EV_ScriptThread_Letterbox
(
" letterbox " ,
EV_DEFAULT ,
" f " ,
" time " ,
" Puts the game in letterbox mode. "
) ;
Event EV_ScriptThread_ClearLetterbox
(
" clearletterbox " ,
EV_DEFAULT ,
" f " ,
" time " ,
" Clears letterbox mode. "
) ;
Event EV_ScriptThread_SetDialogScript
(
" setdialogscript " ,
EV_DEFAULT ,
" s " ,
" dialog_script " ,
" Set the script to be used when dialog:: is used "
) ;
Event EV_ScriptThread_SetLightStyle
(
" setlightstyle " ,
EV_DEFAULT ,
" is " ,
" lightstyleindex lightstyledata " ,
" Set up the lightstyle with lightstyleindex to the specified data "
) ;
Event EV_ScriptThread_CenterPrint
(
" centerprint " ,
EV_DEFAULT ,
" s " ,
" stuffToPrint " ,
" prints the included message in the middle of all player's screens "
) ;
Event EV_ScriptThread_LocationPrint
(
" locprint " ,
EV_DEFAULT ,
" iis " ,
" xoffset yoffset stuffToPrint " ,
" prints the included message in the specified location of all player's screens "
) ;
Event EV_ScriptThread_MissionFailed
(
" missionfailed " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Makes the player fail their mission, level restarts. "
) ;
Event EV_ScriptThread_iHudDraw3d
(
" ihuddraw_3d " ,
EV_DEFAULT ,
" eiviiE " ,
" player index vector_or_offset always_show depth entity " ,
" Sets this huddraw element to be a 3D world icon for individual player and can specify if this icon is always shown on-screen even if the player isn't looking at. \n "
" Uses xy pos from huddraw_rect. \n "
" If entity is specified, the vector will be an offset relative to the entity. \n "
" depth specify if the icon is shown through walls. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_iHudDrawAlign
(
" ihuddraw_align " ,
EV_DEFAULT ,
" eiss " ,
" player index h_align v_align " ,
" Sets the alignment of a huddraw element for given player. Specified with 'left', 'center', or 'right' " ,
EV_NORMAL
) ;
Event EV_ScriptThread_iHudDrawAlpha
(
" ihuddraw_alpha " ,
EV_DEFAULT ,
" eif " ,
" player index alpha " ,
" Sets the alpha of a huddraw element for given player " ,
EV_NORMAL
) ;
Event EV_ScriptThread_iHudDrawColor
(
" ihuddraw_color " ,
EV_DEFAULT ,
" eifff " ,
" player index red green blue " ,
" Sets the color for a huddraw element for given player " ,
EV_NORMAL
) ;
Event EV_ScriptThread_iHudDrawFont
(
" ihuddraw_font " ,
EV_DEFAULT ,
" eis " ,
" player index fontname " ,
" Sets the font to use for given player huddraw element " ,
EV_NORMAL
) ;
Event EV_ScriptThread_iHudDrawRect
(
" ihuddraw_rect " ,
EV_DEFAULT ,
" eiiiii " ,
" player index x y width height " ,
" Specifies the position of the upper left corner and size of a huddraw element for given player " ,
EV_NORMAL
) ;
Event EV_ScriptThread_iHudDrawShader
(
" ihuddraw_shader " ,
EV_DEFAULT ,
" eis " ,
" player index shader " ,
" Sets the shader to use for a particular huddraw element for given player " ,
EV_NORMAL
) ;
Event EV_ScriptThread_iHudDrawString
(
" ihuddraw_string " ,
EV_DEFAULT ,
" eis " ,
" player index string " ,
" Sets a string to be displayed for given player. Clears the shader value " ,
EV_NORMAL
) ;
Event EV_ScriptThread_iHudDrawTimer
(
" ihuddraw_timer " ,
EV_DEFAULT ,
" eiff " ,
" player index duration fade_out_time " ,
" Sets a timer to be displayed and fade within the given time in seconds for given player. Clears the string value and the shader value of huddraw element. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_iHudDrawVirtualSize
(
" ihuddraw_virtualsize " ,
EV_DEFAULT ,
" eii " ,
" player index virtual " ,
" Sets if the huddraw element for given player should use virutal screen resolution for positioning and size " ,
EV_NORMAL
) ;
Event EV_ScriptThread_IsArray
(
" isarray " ,
EV_DEFAULT ,
" s " ,
" object " ,
" Checks whether this variable is an array " ,
EV_RETURN
) ;
Event EV_ScriptThread_IsDefined
(
" isdefined " ,
EV_DEFAULT ,
" s " ,
" object " ,
" Checks whether this entity/variable is defined " ,
EV_RETURN
) ;
Event EV_ScriptThread_IsOnGround
(
" isonground " ,
EV_DEFAULT ,
" e " ,
" entity " ,
" Returns 1 if the entity is on ground. 0 otherwise " ,
EV_RETURN
) ;
Event EV_ScriptThread_IsOutOfBounds
(
" isoutofbounds " ,
EV_DEFAULT ,
" e " ,
" entity " ,
" Returns 1 if the entity is out of bounds. 0 otherwise " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileOpen
(
" fopen " ,
EV_DEFAULT ,
" ss " ,
" filename accesstype " ,
" Opens file, returning it's handle " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileWrite
(
" fwrite " ,
EV_DEFAULT ,
" eii " ,
" player index virtual " ,
" Writes binary buffer to file " ,
EV_NORMAL
) ;
Event EV_ScriptThread_FileRead
(
" fread " ,
EV_DEFAULT ,
" eii " ,
" player index virtual " ,
" Reads binary buffer from file " ,
EV_NORMAL
) ;
Event EV_ScriptThread_FileClose
(
" fclose " ,
EV_DEFAULT ,
" i " ,
" filehandle " ,
" Closes file of given file handle " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileEof
(
" feof " ,
EV_DEFAULT ,
" i " ,
" filehandle " ,
" Checks for end of file " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileSeek
(
" fseek " ,
EV_DEFAULT ,
" iii " ,
" filehandle offset startpos " ,
" Sets file carret at given position " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileTell
(
" ftell " ,
EV_DEFAULT ,
" i " ,
" filehandle " ,
" Gets current file carret position " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileRewind
(
" frewind " ,
EV_DEFAULT ,
" i " ,
" filehandle " ,
" Rewinds file carret to files beginning " ,
EV_NORMAL
) ;
Event EV_ScriptThread_FilePutc
(
" fputc " ,
EV_DEFAULT ,
" ii " ,
" filehandle character " ,
" Writes single character to file " ,
EV_RETURN
) ;
Event EV_ScriptThread_FilePuts
(
" fputs " ,
EV_DEFAULT ,
" is " ,
" filehandle text " ,
" Writes string line to file " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileGetc
(
" fgetc " ,
EV_DEFAULT ,
" i " ,
" filehandle " ,
" Reads single character from file " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileGets
(
" fgets " ,
EV_DEFAULT ,
" ii " ,
" filehandle maxbuffsize " ,
" Reads string line from file " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileError
(
" ferror " ,
EV_DEFAULT ,
" i " ,
" filehandle " ,
" Checks for last file i/o error " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileFlush
(
" fflush " ,
EV_DEFAULT ,
" i " ,
" filehandle " ,
" Flushes given stream. Writes all unsaved data from stream buffer to stream " ,
EV_RETURN
) ;
Event EV_ScriptThread_FlagClear
(
" flag_clear " ,
EV_DEFAULT ,
" s " ,
" name " ,
" Clears and deletes a flag. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_FlagInit
(
" flag_init " ,
EV_DEFAULT ,
" s " ,
" name " ,
" Initializes a flag so it can be set. Flags MUST be initialized before they can be used for the first time. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_FlagSet
(
" flag_set " ,
EV_DEFAULT ,
" s " ,
" name " ,
" Sets a flag which alerts all flag_wait()'s and changes are reflected in flag() checks thereafter. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_FlagWait
(
" flag_wait " ,
EV_DEFAULT ,
" s " ,
" name " ,
" Pauses execution flow until a flag has been set. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_Lock
(
" lock " ,
EV_DEFAULT ,
" l " ,
" lock " ,
" Lock the thread. "
) ;
Event EV_ScriptThread_UnLock
(
" unlock " ,
EV_DEFAULT ,
" l " ,
" lock " ,
" Unlock the thread. "
) ;
Event EV_ScriptThread_GetArrayKeys
(
" getarraykeys " ,
EV_DEFAULT ,
" s " ,
" array " ,
" Retrieves a full list containing the name of arrays " ,
EV_RETURN
) ;
Event EV_ScriptThread_GetArrayValues
(
" getarrayvalues " ,
EV_DEFAULT ,
" s " ,
" array " ,
" Retrieves the full list of an array that was set-up with name, such as local.array[ \" name \" ] and return their values " ,
EV_RETURN
) ;
Event EV_ScriptThread_GetEntArray
(
" getentarray " ,
EV_DEFAULT ,
" ss " ,
" name key " ,
" Gets an array of entities that have the given key, name pair (case sensitive) " ,
EV_RETURN
) ;
Event EV_ScriptThread_GetTime
(
" gettime " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Gets current time " ,
EV_RETURN
) ;
Event EV_ScriptThread_GetTimeZone
(
" gettimezone " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Gets current time zone " ,
EV_RETURN
) ;
Event EV_ScriptThread_PregMatch
(
" preg_match " ,
EV_DEFAULT ,
" ss " ,
" pattern subject " ,
" Searches subject for a match to the regular expression given in pattern. " ,
EV_RETURN
) ;
Event EV_ScriptThread_GetDate
(
" getdate " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Gets current date " ,
EV_RETURN
) ;
Event EV_ScriptThread_RegisterEv
(
" registerev " ,
EV_DEFAULT ,
" ss " ,
" eventname script " ,
" Registers script callback handler for specified event " ,
EV_RETURN
) ;
Event EV_ScriptThread_UnregisterEv
(
" unregisterev " ,
EV_DEFAULT ,
" s " ,
" eventname " ,
" Unregisters script callback handler for specified event " ,
EV_RETURN
) ;
Event EV_ScriptThread_Conprintf
(
" conprintf " ,
EV_DEFAULT ,
" s " ,
" text " ,
" Prints to console " ,
EV_NORMAL
) ;
Event EV_ScriptThread_TeamSwitchDelay
(
" teamswitchdelay " ,
EV_DEFAULT ,
" f " ,
" delay " ,
" Sets delay between switching teams. [DEPRECATED] " ,
EV_NORMAL
) ;
Event EV_ScriptThread_CharToInt
(
" chartoint " ,
EV_DEFAULT ,
" s " ,
" character " ,
" Converts char to int " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileExists
(
" fexists " ,
EV_DEFAULT ,
" s " ,
" filename " ,
" Checks if file exists " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileReadAll
(
" freadall " ,
EV_DEFAULT ,
" i " ,
" filehandle " ,
" Reads whole file and returns it as string " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileSaveAll
(
" fsaveall " ,
EV_DEFAULT ,
" is " ,
" filehandle text " ,
" Saves whole text to file " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileRemove
(
" fremove " ,
EV_DEFAULT ,
" s " ,
" filename " ,
" Removes the file " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileRename
(
" frename " ,
EV_DEFAULT ,
" ss " ,
" oldfilename newfilename " ,
" Renames the file " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileCopy
(
" fcopy " ,
EV_DEFAULT ,
" ss " ,
" filename copyfilename " ,
" Copies the file " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileReadPak
(
" freadpak " ,
EV_DEFAULT ,
" s " ,
" filename " ,
" Reads file from pak file " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileList
(
" flist " ,
EV_DEFAULT ,
" ssi " ,
" path extension wantSubs " ,
" Returns the list of files with given extension " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileNewDirectory
(
" fnewdir " ,
EV_DEFAULT ,
" s " ,
" path " ,
" Creates a new directory " ,
EV_RETURN
) ;
Event EV_ScriptThread_FileRemoveDirectory
(
" fremovedir " ,
EV_DEFAULT ,
" s " ,
" path " ,
" Removes a directory " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathCos
(
" cos " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute cosine " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathSin
(
" sin " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute sine " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathTan
(
" tan " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute tangent " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathACos
(
" acos " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute arc cosine " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathASin
(
" asin " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute arc sine " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathATan
(
" atan " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute arc tangent " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathATan2
(
" atan2 " ,
EV_DEFAULT ,
" ff " ,
" x y " ,
" Compute arc tangent with two parameters " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathCosH
(
" cosh " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute hyperbolic cosine " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathSinH
(
" sinh " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute hyperbolic sine " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathTanH
(
" tanh " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute hyperbolic tangent " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathExp
(
" exp " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute exponential function " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathFrexp
(
" frexp " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Get significand and exponent " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathLdexp
(
" ldexp " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Generate number from significand and exponent " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathLog
(
" log " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute natural logarithm " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathLog10
(
" log10 " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute common logarithm " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathModf
(
" modf " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Break into fractional and integral parts " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathPow
(
" pow " ,
EV_DEFAULT ,
" ff " ,
" x y " ,
" Raise to power " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathSqrt
(
" sqrt " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute square root " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathCeil
(
" ceil " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Round up value " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathFloor
(
" floor " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Round down value " ,
EV_RETURN
) ;
Event EV_ScriptThread_MathFmod
(
" fmod " ,
EV_DEFAULT ,
" f " ,
" x " ,
" Compute remainder of division " ,
EV_RETURN
) ;
Event EV_ScriptThread_strncpy
(
" strncpy " ,
EV_DEFAULT ,
" is " ,
" bytes source " ,
" Returns the copied string with the specified bytes " ,
EV_RETURN
) ;
Event EV_ScriptThread_CreateHUD
(
" newhud " ,
EV_DEFAULT ,
" E " ,
" player " ,
" Create a new HUD element. Optionally for a particular client " ,
EV_RETURN
) ;
Event EV_ScriptThread_TraceDetails
(
" traced " ,
EV_DEFAULT ,
" vvIVVI " ,
" start end pass_entities mins maxs mask " ,
" Performs a Trace Line from the start to the end, returns the array with detailed results " ,
EV_RETURN
) ;
Event EV_ScriptThread_TypeOf
(
" typeof " ,
EV_DEFAULT ,
" i " ,
" variable " ,
" Returns the type of variable " ,
EV_RETURN
) ;
Event EV_ScriptThread_Md5String
(
" md5string " ,
EV_DEFAULT ,
" s " ,
" text " ,
" generates MD5 hash of given text " ,
EV_RETURN
) ;
Event EV_ScriptThread_GetEntity
(
" getentity " ,
EV_DEFAULT ,
" i " ,
" entnum " ,
" returns entity with given entnum " ,
EV_RETURN
) ;
Event EV_ScriptThread_SetTimer
(
" settimer " ,
EV_DEFAULT ,
" is " ,
" interval script " ,
" Sets timer that will execute script after given interval. " ,
EV_RETURN
) ;
Event EV_ScriptThread_TeamGetScore
(
" team_getscore " ,
EV_DEFAULT ,
" s " ,
" team " ,
" Get a team's current score. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_TeamSetScore
(
" team_setscore " ,
EV_DEFAULT ,
" siI " ,
" team score bAdd " ,
" Change/Add score to a team. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_VisionGetNaked
(
" visiongetnaked " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Gets players' global current naked-eye vision. " ,
EV_NORMAL
) ;
Event EV_ScriptThread_VisionSetNaked
(
" visionsetnaked " ,
EV_DEFAULT ,
" sF " ,
" vision_name transition_time " ,
" Sets players' naked-eye vision. Optionally give a transition time from the current vision. If vision_name is an empty string, it will be set to the current map's name. " ,
EV_NORMAL
) ;
CLASS_DECLARATION ( Listener , ScriptThread , NULL )
{
{ & EV_Listener_CreateReturnThread , & ScriptThread : : CreateReturnThread } ,
{ & EV_Listener_CreateThread , & ScriptThread : : CreateThread } ,
{ & EV_Listener_ExecuteReturnScript , & ScriptThread : : ExecuteReturnScript } ,
{ & EV_Listener_ExecuteScript , & ScriptThread : : ExecuteScript } ,
{ & EV_ScriptThread_Abs , & ScriptThread : : GetAbs } ,
{ & EV_ScriptThread_AnglesToForward , & ScriptThread : : Angles_ToForward } ,
{ & EV_ScriptThread_AnglesToLeft , & ScriptThread : : Angles_ToLeft } ,
{ & EV_ScriptThread_AnglesToUp , & ScriptThread : : Angles_ToUp } ,
{ & EV_ScriptThread_Assert , & ScriptThread : : Assert } ,
{ & EV_ScriptThread_Precache_Cache , & ScriptThread : : Cache } ,
{ & EV_ScriptThread_CastBoolean , & ScriptThread : : CastBoolean } ,
{ & EV_ScriptThread_CastEntity , & ScriptThread : : CastEntity } ,
{ & EV_ScriptThread_CastFloat , & ScriptThread : : CastFloat } ,
{ & EV_ScriptThread_CastInt , & ScriptThread : : CastInt } ,
{ & EV_ScriptThread_CastString , & ScriptThread : : CastString } ,
{ & EV_ScriptThread_CreateListener , & ScriptThread : : EventCreateListener } ,
{ & EV_DelayThrow , & ScriptThread : : EventDelayThrow } ,
{ & EV_ScriptThread_End , & ScriptThread : : EventEnd } ,
{ & EV_ScriptThread_Timeout , & ScriptThread : : EventTimeout } ,
{ & EV_ScriptThread_Error , & ScriptThread : : EventError } ,
{ & EV_ScriptThread_GetSelf , & ScriptThread : : GetSelf } ,
{ & EV_ScriptThread_Goto , & ScriptThread : : EventGoto } ,
{ & EV_ScriptThread_Println , & ScriptThread : : Println } ,
{ & EV_ScriptThread_Print , & ScriptThread : : Print } ,
{ & EV_ScriptThread_MPrintln , & ScriptThread : : MPrintln } ,
{ & EV_ScriptThread_MPrint , & ScriptThread : : MPrint } ,
{ & EV_ScriptThread_RandomFloat , & ScriptThread : : RandomFloat } ,
{ & EV_ScriptThread_RandomInt , & ScriptThread : : RandomInt } ,
{ & EV_ScriptThread_RegisterCommand , & ScriptThread : : EventRegisterCommand } ,
{ & EV_ScriptThread_GetCvar , & ScriptThread : : EventGetCvar } ,
{ & EV_ScriptThread_SetCvar , & ScriptThread : : EventSetCvar } ,
{ & EV_ScriptThread_Spawn , & ScriptThread : : Spawn } ,
{ & EV_ScriptThread_SpawnReturn , & ScriptThread : : SpawnReturn } ,
{ & EV_Throw , & ScriptThread : : EventThrow } ,
{ & EV_ScriptThread_VectorAdd , & ScriptThread : : EventVectorAdd } ,
{ & EV_ScriptThread_VectorCloser , & ScriptThread : : EventVectorCloser } ,
{ & EV_ScriptThread_VectorCross , & ScriptThread : : EventVectorCross } ,
{ & EV_ScriptThread_VectorDot , & ScriptThread : : EventVectorDot } ,
{ & EV_ScriptThread_VectorLength , & ScriptThread : : EventVectorLength } ,
{ & EV_ScriptThread_VectorNormalize , & ScriptThread : : EventVectorNormalize } ,
{ & EV_ScriptThread_VectorScale , & ScriptThread : : EventVectorScale } ,
{ & EV_ScriptThread_VectorSubtract , & ScriptThread : : EventVectorSubtract } ,
{ & EV_ScriptThread_VectorToAngles , & ScriptThread : : EventVectorToAngles } ,
{ & EV_ScriptThread_VectorWithin , & ScriptThread : : EventVectorWithin } ,
{ & EV_ScriptThread_Wait , & ScriptThread : : EventWait } ,
{ & EV_ScriptThread_WaitFrame , & ScriptThread : : EventWaitFrame } ,
{ & EV_ScriptThread_GetBoundKey1 , & ScriptThread : : EventGetBoundKey1 } ,
{ & EV_ScriptThread_GetBoundKey2 , & ScriptThread : : EventGetBoundKey2 } ,
{ & EV_ScriptThread_LocConvertString , & ScriptThread : : EventLocConvertString } ,
{ & EV_ScriptThread_IsArray , & ScriptThread : : EventIsArray } ,
{ & EV_ScriptThread_IsDefined , & ScriptThread : : EventIsDefined } ,
{ & EV_ScriptThread_MathACos , & ScriptThread : : MathACos } ,
{ & EV_ScriptThread_MathASin , & ScriptThread : : MathASin } ,
{ & EV_ScriptThread_MathATan , & ScriptThread : : MathATan } ,
{ & EV_ScriptThread_MathATan2 , & ScriptThread : : MathATan2 } ,
{ & EV_ScriptThread_MathCeil , & ScriptThread : : MathCeil } ,
{ & EV_ScriptThread_MathCos , & ScriptThread : : MathCos } ,
{ & EV_ScriptThread_MathCosH , & ScriptThread : : MathCosH } ,
{ & EV_ScriptThread_MathExp , & ScriptThread : : MathExp } ,
{ & EV_ScriptThread_MathFloor , & ScriptThread : : MathFloor } ,
{ & EV_ScriptThread_MathFmod , & ScriptThread : : MathFmod } ,
{ & EV_ScriptThread_MathFrexp , & ScriptThread : : MathFrexp } ,
{ & EV_ScriptThread_MathLdexp , & ScriptThread : : MathLdexp } ,
{ & EV_ScriptThread_MathLog , & ScriptThread : : MathLog } ,
{ & EV_ScriptThread_MathLog10 , & ScriptThread : : MathLog10 } ,
{ & EV_ScriptThread_MathModf , & ScriptThread : : MathModf } ,
{ & EV_ScriptThread_MathPow , & ScriptThread : : MathPow } ,
{ & EV_ScriptThread_MathSin , & ScriptThread : : MathSin } ,
{ & EV_ScriptThread_MathSinH , & ScriptThread : : MathSinH } ,
{ & EV_ScriptThread_MathSqrt , & ScriptThread : : MathSqrt } ,
{ & EV_ScriptThread_MathTan , & ScriptThread : : MathTan } ,
{ & EV_ScriptThread_MathTanH , & ScriptThread : : MathTanH } ,
{ & EV_ScriptThread_strncpy , & ScriptThread : : StringBytesCopy } ,
{ & EV_ScriptThread_Md5String , & ScriptThread : : Md5String } ,
{ & EV_ScriptThread_TypeOf , & ScriptThread : : TypeOfVariable } ,
{ & EV_ScriptThread_RegisterEv , & ScriptThread : : RegisterEvent } ,
{ & EV_ScriptThread_UnregisterEv , & ScriptThread : : UnregisterEvent } ,
{ & EV_ScriptThread_CancelWaiting , & ScriptThread : : CancelWaiting } ,
{ & EV_ScriptThread_GetTime , & ScriptThread : : GetTime } ,
{ & EV_ScriptThread_GetTimeZone , & ScriptThread : : GetTimeZone } ,
{ & EV_ScriptThread_PregMatch , & ScriptThread : : PregMatch } ,
{ & EV_ScriptThread_FlagClear , & ScriptThread : : FlagClear } ,
{ & EV_ScriptThread_FlagInit , & ScriptThread : : FlagInit } ,
{ & EV_ScriptThread_FlagSet , & ScriptThread : : FlagSet } ,
{ & EV_ScriptThread_FlagWait , & ScriptThread : : FlagWait } ,
{ & EV_ScriptThread_RestoreSoundtrack , & ScriptThread : : RestoreSoundtrackEvent } ,
{ & EV_ScriptThread_Map , & ScriptThread : : MapEvent } ,
{ & EV_ScriptThread_AnglesPointAt , & ScriptThread : : Angles_PointAt } ,
{ & EV_ScriptThread_BspTransition , & ScriptThread : : EventBspTransition } ,
{ & EV_ScriptThread_LevelTransition , & ScriptThread : : EventLevelTransition } ,
{ & EV_ScriptThread_MissionTransition , & ScriptThread : : EventMissionTransition } ,
{ & EV_ScriptThread_FadeIn , & ScriptThread : : FadeIn } ,
{ & EV_ScriptThread_FadeOut , & ScriptThread : : FadeOut } ,
{ & EV_ScriptThread_FadeSound , & ScriptThread : : FadeSound } ,
{ & EV_ScriptThread_ClearFade , & ScriptThread : : ClearFade } ,
{ & EV_ScriptThread_Letterbox , & ScriptThread : : Letterbox } ,
{ & EV_ScriptThread_ClearLetterbox , & ScriptThread : : ClearLetterbox } ,
{ & EV_ScriptThread_MusicEvent , & ScriptThread : : MusicEvent } ,
{ & EV_ScriptThread_ForceMusicEvent , & ScriptThread : : ForceMusicEvent } ,
{ & EV_ScriptThread_MusicVolumeEvent , & ScriptThread : : MusicVolumeEvent } ,
{ & EV_ScriptThread_RestoreMusicVolumeEvent , & ScriptThread : : RestoreMusicVolumeEvent } ,
{ & EV_ScriptThread_SoundtrackEvent , & ScriptThread : : SoundtrackEvent } ,
{ & EV_ScriptThread_RestoreSoundtrackEvent , & ScriptThread : : RestoreSoundtrackEvent } ,
{ & EV_ScriptThread_CameraCommand , & ScriptThread : : CameraCommand } ,
{ & EV_ScriptThread_SetCinematic , & ScriptThread : : SetCinematic } ,
{ & EV_ScriptThread_SetNonCinematic , & ScriptThread : : SetNonCinematic } ,
{ & EV_ScriptThread_KillEnt , & ScriptThread : : KillEnt } ,
{ & EV_ScriptThread_RemoveEnt , & ScriptThread : : RemoveEnt } ,
{ & EV_ScriptThread_KillClass , & ScriptThread : : KillClass } ,
{ & EV_ScriptThread_RemoveClass , & ScriptThread : : RemoveClass } ,
{ & EV_ScriptThread_SetLightStyle , & ScriptThread : : SetLightStyle } ,
{ & EV_ScriptThread_CenterPrint , & ScriptThread : : CenterPrint } ,
{ & EV_ScriptThread_LocationPrint , & ScriptThread : : LocationPrint } ,
{ & EV_ScriptThread_Trigger , & ScriptThread : : TriggerEvent } ,
{ & EV_ScriptThread_ServerOnly , & ScriptThread : : ServerEvent } ,
{ & EV_ScriptThread_StuffCommand , & ScriptThread : : StuffCommand } ,
{ & EV_ScriptThread_MissionFailed , & ScriptThread : : MissionFailed } ,
{ & EV_ScriptThread_IsAlive , & ScriptThread : : EventIsAlive } ,
{ & EV_ScriptThread_HudDraw3d , & ScriptThread : : EventHudDraw3d } ,
{ & EV_ScriptThread_HudDrawTimer , & ScriptThread : : EventHudDrawTimer } ,
{ & EV_ScriptThread_HudDrawAlign , & ScriptThread : : EventHudDrawAlign } ,
{ & EV_ScriptThread_HudDrawAlpha , & ScriptThread : : EventHudDrawAlpha } ,
{ & EV_ScriptThread_HudDrawColor , & ScriptThread : : EventHudDrawColor } ,
{ & EV_ScriptThread_HudDrawFont , & ScriptThread : : EventHudDrawFont } ,
{ & EV_ScriptThread_HudDrawRect , & ScriptThread : : EventHudDrawRect } ,
{ & EV_ScriptThread_HudDrawShader , & ScriptThread : : EventHudDrawShader } ,
{ & EV_ScriptThread_HudDrawString , & ScriptThread : : EventHudDrawString } ,
{ & EV_ScriptThread_HudDrawVirtualSize , & ScriptThread : : EventHudDrawVirtualSize } ,
{ & EV_ScriptThread_AddObjective , & ScriptThread : : AddObjective } ,
{ & EV_ScriptThread_ClearObjectivePos , & ScriptThread : : ClearObjectiveLocation } ,
{ & EV_ScriptThread_SetCurrentObjective , & ScriptThread : : SetCurrentObjective } ,
{ & EV_ScriptThread_SetObjectivePos , & ScriptThread : : SetObjectiveLocation } ,
{ & EV_ScriptThread_AllAIOff , & ScriptThread : : AllAIOff } ,
{ & EV_ScriptThread_AllAIOn , & ScriptThread : : AllAIOn } ,
{ & EV_ScriptThread_TeamWin , & ScriptThread : : EventTeamWin } ,
{ & EV_ScriptThread_DrawHud , & ScriptThread : : EventDrawHud } ,
{ & EV_ScriptThread_RadiusDamage , & ScriptThread : : EventRadiusDamage } ,
{ & EV_ScriptThread_Earthquake , & ScriptThread : : EventEarthquake } ,
{ & EV_ScriptThread_CueCamera , & ScriptThread : : CueCamera } ,
{ & EV_ScriptThread_CuePlayer , & ScriptThread : : CuePlayer } ,
{ & EV_ScriptThread_FreezePlayer , & ScriptThread : : FreezePlayer } ,
{ & EV_ScriptThread_ReleasePlayer , & ScriptThread : : ReleasePlayer } ,
{ & EV_ScriptThread_KillEnt , & ScriptThread : : KillEnt } ,
{ & EV_ScriptThread_ForceMusic , & ScriptThread : : ForceMusicEvent } ,
{ & EV_ScriptThread_SetSoundtrack , & ScriptThread : : SoundtrackEvent } ,
{ & EV_ScriptThread_SightTrace , & ScriptThread : : EventSightTrace } ,
{ & EV_ScriptThread_Trace , & ScriptThread : : EventTrace } ,
{ & EV_ScriptThread_IPrintln , & ScriptThread : : IPrintln } ,
{ & EV_ScriptThread_IPrintln_NoLoc , & ScriptThread : : IPrintln_NoLoc } ,
{ & EV_ScriptThread_IPrintlnBold , & ScriptThread : : IPrintlnBold } ,
{ & EV_ScriptThread_IPrintlnBold_NoLoc , & ScriptThread : : IPrintlnBold_NoLoc } ,
{ & EV_ScriptThread_Print3D , & ScriptThread : : EventPrint3D } ,
{ & EV_ScriptThread_CanSwitchTeams , & ScriptThread : : CanSwitchTeams } ,
{ & EV_ScriptThread_CharToInt , & ScriptThread : : CharToInt } ,
{ & EV_ScriptThread_Conprintf , & ScriptThread : : Conprintf } ,
{ & EV_ScriptThread_CreateHUD , & ScriptThread : : CreateHUD } ,
{ & EV_ScriptThread_Earthquake2 , & ScriptThread : : Earthquake } ,
{ & EV_ScriptThread_FadeSound , & ScriptThread : : FadeSound } ,
{ & EV_ScriptThread_FileClose , & ScriptThread : : FileClose } ,
{ & EV_ScriptThread_FileCopy , & ScriptThread : : FileCopy } ,
{ & EV_ScriptThread_FileEof , & ScriptThread : : FileEof } ,
{ & EV_ScriptThread_FileError , & ScriptThread : : FileError } ,
{ & EV_ScriptThread_FileExists , & ScriptThread : : FileExists } ,
{ & EV_ScriptThread_FileFlush , & ScriptThread : : FileFlush } ,
{ & EV_ScriptThread_FileGetc , & ScriptThread : : FileGetc } ,
{ & EV_ScriptThread_FileGets , & ScriptThread : : FileGets } ,
{ & EV_ScriptThread_FileList , & ScriptThread : : FileList } ,
{ & EV_ScriptThread_FileNewDirectory , & ScriptThread : : FileNewDirectory } ,
{ & EV_ScriptThread_FileOpen , & ScriptThread : : FileOpen } ,
{ & EV_ScriptThread_FilePutc , & ScriptThread : : FilePutc } ,
{ & EV_ScriptThread_FilePuts , & ScriptThread : : FilePuts } ,
{ & EV_ScriptThread_FileRead , & ScriptThread : : FileRead } ,
{ & EV_ScriptThread_FileReadAll , & ScriptThread : : FileReadAll } ,
{ & EV_ScriptThread_FileRemove , & ScriptThread : : FileRemove } ,
{ & EV_ScriptThread_FileRemoveDirectory , & ScriptThread : : FileRemoveDirectory } ,
{ & EV_ScriptThread_FileRename , & ScriptThread : : FileRename } ,
{ & EV_ScriptThread_FileRewind , & ScriptThread : : FileRewind } ,
{ & EV_ScriptThread_FileSaveAll , & ScriptThread : : FileSaveAll } ,
{ & EV_ScriptThread_FileSeek , & ScriptThread : : FileSeek } ,
{ & EV_ScriptThread_FileTell , & ScriptThread : : FileTell } ,
{ & EV_ScriptThread_FileWrite , & ScriptThread : : FileWrite } ,
{ & EV_ScriptThread_GetAreaEntities , & ScriptThread : : GetAreaEntities } ,
{ & EV_ScriptThread_GetArrayKeys , & ScriptThread : : GetArrayKeys } ,
{ & EV_ScriptThread_GetArrayValues , & ScriptThread : : GetArrayValues } ,
{ & EV_ScriptThread_GetDate , & ScriptThread : : GetDate } ,
{ & EV_ScriptThread_GetEntArray , & ScriptThread : : GetEntArray } ,
{ & EV_ScriptThread_GetEntity , & ScriptThread : : GetEntity } ,
{ & EV_ScriptThread_GetPlayerClientNum , & ScriptThread : : GetPlayerClientNum } ,
{ & EV_ScriptThread_GetPlayerIP , & ScriptThread : : GetPlayerIP } ,
{ & EV_ScriptThread_GetPlayerNetname , & ScriptThread : : GetPlayerNetname } ,
{ & EV_ScriptThread_GetPlayerPing , & ScriptThread : : GetPlayerPing } ,
{ & EV_ScriptThread_iHudDraw3d , & ScriptThread : : EventIHudDraw3d } ,
{ & EV_ScriptThread_iHudDrawAlign , & ScriptThread : : EventIHudDrawAlign } ,
{ & EV_ScriptThread_iHudDrawAlpha , & ScriptThread : : EventIHudDrawAlpha } ,
{ & EV_ScriptThread_iHudDrawColor , & ScriptThread : : EventIHudDrawColor } ,
{ & EV_ScriptThread_iHudDrawFont , & ScriptThread : : EventIHudDrawFont } ,
{ & EV_ScriptThread_iHudDrawRect , & ScriptThread : : EventIHudDrawRect } ,
{ & EV_ScriptThread_iHudDrawShader , & ScriptThread : : EventIHudDrawShader } ,
{ & EV_ScriptThread_iHudDrawString , & ScriptThread : : EventIHudDrawString } ,
{ & EV_ScriptThread_iHudDrawTimer , & ScriptThread : : EventIHudDrawTimer } ,
{ & EV_ScriptThread_iHudDrawVirtualSize , & ScriptThread : : EventIHudDrawVirtualSize } ,
{ & EV_ScriptThread_IsOnGround , & ScriptThread : : EventIsOnGround } ,
{ & EV_ScriptThread_IsOutOfBounds , & ScriptThread : : EventIsOutOfBounds } ,
{ & EV_ScriptThread_RestoreSound , & ScriptThread : : RestoreSound } ,
{ & EV_ScriptThread_RemoveArchivedClass , & ScriptThread : : RemoveArchivedClass } ,
{ & EV_ScriptThread_ServerStufftext , & ScriptThread : : ServerStufftext } ,
{ & EV_ScriptThread_SetTimer , & ScriptThread : : SetTimer } ,
{ & EV_ScriptThread_TeamGetScore , & ScriptThread : : TeamGetScore } ,
{ & EV_ScriptThread_TeamSetScore , & ScriptThread : : TeamSetScore } ,
{ & EV_ScriptThread_TraceDetails , & ScriptThread : : TraceDetails } ,
{ & EV_ScriptThread_VisionGetNaked , & ScriptThread : : VisionGetNaked } ,
{ & EV_ScriptThread_VisionSetNaked , & ScriptThread : : VisionSetNaked } ,
{ NULL , NULL }
} ;
2023-01-30 17:11:44 +01:00
MEM_BlockAlloc < ScriptThread > ScriptThread_allocator ;
2023-01-29 22:57:04 +01:00
void * ScriptThread : : operator new ( size_t size )
{
return ScriptThread_allocator . Alloc ( ) ;
}
void ScriptThread : : operator delete ( void * ptr )
{
ScriptThread_allocator . Free ( ptr ) ;
}
ScriptThread : : ScriptThread ( )
{
m_ScriptVM = NULL ;
}
ScriptThread : : ScriptThread ( ScriptClass * scriptClass , unsigned char * pCodePos )
{
m_ScriptVM = new ScriptVM ( scriptClass , pCodePos , this ) ;
m_ScriptVM - > m_ThreadState = THREAD_RUNNING ;
}
ScriptThread : : ~ ScriptThread ( )
{
ScriptVM * vm = m_ScriptVM ;
2023-01-30 00:50:21 +01:00
assert ( vm ) ;
if ( ! vm )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
// should never happen
throw ScriptException ( " Attempting to delete a dead thread. " ) ;
2023-01-29 22:57:04 +01:00
}
m_ScriptVM = NULL ;
if ( vm - > ThreadState ( ) = = THREAD_WAITING )
{
vm - > m_ThreadState = THREAD_RUNNING ;
Director . RemoveTiming ( this ) ;
}
else if ( vm - > ThreadState ( ) = = THREAD_SUSPENDED )
{
vm - > m_ThreadState = THREAD_RUNNING ;
CancelWaitingAll ( ) ;
}
vm - > NotifyDelete ( ) ;
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Execute
(
Event & ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Execute ( & ev ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Execute
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
assert ( m_ScriptVM ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
try
{
if ( ev = = NULL )
{
ScriptExecuteInternal ( ) ;
}
else
{
ScriptVariable returnValue ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
returnValue . newPointer ( ) ;
ScriptExecute ( ev - > data , ev - > dataSize , returnValue ) ;
ev - > AddValue ( returnValue ) ;
}
}
catch ( ScriptException & exc )
{
if ( exc . bAbort )
{
gi . Error ( ERR_DROP , " %s \n " , exc . string . c_str ( ) ) ;
}
else
{
Com_Printf ( " ^~^~^ Script Error: %s \n " , exc . string . c_str ( ) ) ;
}
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Execute
(
ScriptVariable * data ,
int dataSize
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ScriptExecuteInternal ( data , dataSize ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : DelayExecute
(
Event & ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
DelayExecute ( & ev ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : DelayExecute
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
assert ( m_ScriptVM ) ;
if ( ev )
{
ScriptVariable returnValue ;
m_ScriptVM - > SetFastData ( ev - > data , ev - > dataSize ) ;
returnValue . newPointer ( ) ;
m_ScriptVM - > m_ReturnValue = returnValue ;
ev - > AddValue ( returnValue ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
Director . AddTiming ( this , 0 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ScriptClass * ScriptThread : : GetScriptClass ( void )
{
return m_ScriptVM - > m_ScriptClass ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
str ScriptThread : : FileName ( void )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
return m_ScriptVM - > Filename ( ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
int ScriptThread : : GetThreadState ( void )
{
return m_ScriptVM - > ThreadState ( ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : ScriptExecute ( ScriptVariable * data , int dataSize , ScriptVariable & returnValue )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
m_ScriptVM - > m_ReturnValue = returnValue ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ScriptExecuteInternal ( data , dataSize ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : ScriptExecuteInternal ( ScriptVariable * data , int dataSize )
{
SafePtr < ScriptThread > currentThread = Director . m_CurrentThread ;
SafePtr < ScriptThread > previousThread = Director . m_PreviousThread ;
Director . m_PreviousThread = currentThread ;
Director . m_CurrentThread = this ;
Stop ( ) ;
m_ScriptVM - > Execute ( data , dataSize ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
// restore the previous values
Director . m_CurrentThread = currentThread ;
Director . m_PreviousThread = previousThread ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
Director . ExecuteRunning ( ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : StoppedNotify ( void )
{
// This is invalid and we mustn't get here
if ( m_ScriptVM ) {
delete this ;
}
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : StartedWaitFor ( void )
{
Stop ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
m_ScriptVM - > m_ThreadState = THREAD_SUSPENDED ;
m_ScriptVM - > Suspend ( ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : StoppedWaitFor ( const_str name , bool bDeleting )
{
if ( ! m_ScriptVM )
2023-01-29 22:57:04 +01:00
{
return ;
}
2023-01-30 00:50:21 +01:00
// The thread is deleted if the listener is deleting
if ( bDeleting )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
delete this ;
2023-01-29 22:57:04 +01:00
return ;
}
2023-01-30 00:50:21 +01:00
CancelEventsOfType ( EV_ScriptThread_CancelWaiting ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( m_ScriptVM - > m_ThreadState = = THREAD_SUSPENDED )
{
if ( name ! = 0 )
{
if ( m_ScriptVM - > state = = STATE_EXECUTION )
{
Execute ( ) ;
}
else
{
m_ScriptVM - > Resume ( ) ;
}
}
else
{
m_ScriptVM - > m_ThreadState = THREAD_RUNNING ;
CancelWaitingAll ( ) ;
m_ScriptVM - > m_ThreadState = THREAD_WAITING ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
Director . AddTiming ( this , 0.0f ) ;
}
}
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ScriptThread * ScriptThread : : CreateThreadInternal ( const ScriptVariable & label )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
return m_ScriptVM - > GetScriptClass ( ) - > CreateThreadInternal ( label ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ScriptThread * ScriptThread : : CreateScriptInternal ( const ScriptVariable & label )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
return m_ScriptVM - > GetScriptClass ( ) - > CreateScriptInternal ( label ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Pause ( )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Stop ( ) ;
m_ScriptVM - > Suspend ( ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : Stop ( void )
{
if ( m_ScriptVM - > ThreadState ( ) = = THREAD_WAITING )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
m_ScriptVM - > m_ThreadState = THREAD_RUNNING ;
Director . RemoveTiming ( this ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else if ( m_ScriptVM - > ThreadState ( ) = = THREAD_SUSPENDED )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
m_ScriptVM - > m_ThreadState = THREAD_RUNNING ;
CancelWaitingAll ( ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : Wait ( float time )
{
StartTiming ( time ) ;
m_ScriptVM - > Suspend ( ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : StartTiming ( float time )
{
Stop ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
m_ScriptVM - > m_ThreadState = THREAD_WAITING ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( time < 0 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
time = 0 ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
Director . AddTiming ( this , time ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : StartTiming ( void )
{
StartTiming ( 0 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : CreateReturnThread
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
m_ScriptVM - > GetScriptClass ( ) - > CreateReturnThread ( ev ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : CreateThread
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
m_ScriptVM - > GetScriptClass ( ) - > CreateThread ( ev ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : ExecuteReturnScript
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
m_ScriptVM - > GetScriptClass ( ) - > ExecuteReturnScript ( ev ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : ExecuteScript
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
m_ScriptVM - > GetScriptClass ( ) - > ExecuteScript ( ev ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventCreateListener
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
ev - > AddListener ( new Listener ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : CancelWaiting
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
CancelWaitingAll ( ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : Archive ( Archiver & arc )
{
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : ArchiveInternal ( Archiver & arc )
{
Listener : : Archive ( arc ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
arc . ArchiveObjectPosition ( this ) ;
m_ScriptVM - > Archive ( arc ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetAbs
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
ScriptVariable & val = ev - > GetValue ( 1 ) ;
if ( val . GetType ( ) = = VARIABLE_INTEGER )
{
ev - > AddInteger ( ev - > GetInteger ( 1 ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else
{
if ( val . GetType ( ) ! = VARIABLE_FLOAT )
{
throw ScriptException ( " abs applied to bad type '%s' " , val . GetTypeName ( ) ) ;
}
ev - > AddFloat ( fabs ( ev - > GetFloat ( 1 ) ) ) ;
}
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : ServerStufftext
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
gi . SendConsoleCommand ( ev - > GetString ( 1 ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : RemoveArchivedClass
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
str classname ;
int except_entity_number = - 1 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
classname = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 1 ) {
except_entity_number = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
for ( int i = level . m_SimpleArchivedEntities . NumObjects ( ) ; i > 0 ; i - - )
{
SimpleArchivedEntity * m_SimpleArchivedEntity = level . m_SimpleArchivedEntities . ObjectAt ( i ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( m_SimpleArchivedEntity = = NULL ) {
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
// If found, remove the simple archived entity
if ( m_SimpleArchivedEntity - > inheritsFrom ( classname ) )
{
m_SimpleArchivedEntity - > PostEvent ( EV_Remove , EV_REMOVE ) ;
}
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
L_ProcessPendingEvents ( ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : SetTimer
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int interval = - 1 ;
void * scr_var = NULL ;
int i = 0 ;
Event * event ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) ! = 2 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for settimer! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
interval = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( interval < = 0 ) {
ev - > AddInteger ( 1 ) ;
return ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
event = new Event ( EV_Listener_ExecuteScript ) ;
event - > AddValue ( ev - > GetValue ( 2 ) ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
PostEvent ( event , ( float ) interval / 1000.0f ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Angles_ToForward
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Vector fwd ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > GetVector ( 1 ) . AngleVectorsLeft ( & fwd ) ;
ev - > AddVector ( fwd ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : Angles_ToLeft
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
Vector left ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > GetVector ( 1 ) . AngleVectorsLeft ( NULL , & left ) ;
ev - > AddVector ( left ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Angles_ToUp
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Vector up ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > GetVector ( 1 ) . AngleVectorsLeft ( NULL , NULL , & up ) ;
ev - > AddVector ( up ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : Assert
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
assert ( ev - > GetFloat ( 1 ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : Cache
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
# ifdef GAME_DLL
CacheResource ( ev - > GetString ( 1 ) ) ;
# endif
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : CastBoolean
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
ev - > AddInteger ( ev - > GetBoolean ( 1 ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : CastEntity
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
ev - > AddListener ( ( Listener * ) ev - > GetEntity ( 1 ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : CastFloat
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
ev - > AddFloat ( ev - > GetFloat ( 1 ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : CastInt
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
ev - > AddInteger ( ev - > GetInteger ( 1 ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : CastString
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
ev - > AddString ( ev - > GetString ( 1 ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
// seems to work like EventThrow
void ScriptThread : : EventDelayThrow
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
if ( ! m_ScriptVM - > m_PrevCodePos ) {
return ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( m_ScriptVM - > EventThrow ( ev ) )
{
if ( m_ScriptVM - > State ( ) = = STATE_EXECUTION )
{
Wait ( 0 ) ;
}
else
{
Stop ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
m_ScriptVM - > Resume ( ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else
{
// we make sure this won't get deleted
SafePtr < ScriptThread > This = this ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
Stop ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! BroadcastEvent ( 0 , * ev ) )
{
m_ScriptVM - > GetScriptClass ( ) - > EventDelayThrow ( ev ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( This )
{
delete this ;
}
}
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventEnd
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
if ( ev - > NumArgs ( ) > 0 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ScriptVariable value = ev - > GetValue ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
m_ScriptVM - > End ( value ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddValue ( value ) ;
}
else
{
m_ScriptVM - > End ( ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventTimeout
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Director . maxTime = ev - > GetFloat ( 1 ) * 1000.0f + 0.5f ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventError
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
if ( ev - > NumArgs ( ) > 1 )
{
ScriptException : : next_abort = 0 ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ScriptException : : next_abort = ev - > GetInteger ( 2 ) ;
if ( ScriptException : : next_abort < 0 )
{
ScriptException : : next_abort = 0 ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
throw ScriptException ( ev - > GetString ( 1 ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventGoto
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
m_ScriptVM - > EventGoto ( ev ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( m_ScriptVM - > State ( ) = = STATE_EXECUTION )
{
ScriptExecuteInternal ( ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else
{
Stop ( ) ;
m_ScriptVM - > Resume ( ) ;
2023-01-29 22:57:04 +01:00
}
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventRegisterCommand
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
# ifdef CGAME_DLL
ScriptThreadLabel scriptLabel ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
scriptLabel . SetThread ( ev - > GetValue ( 2 ) ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
m_scriptCmds . addKeyValue ( ev - > GetString ( 1 ) ) = scriptLabel ;
# endif
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventGetCvar
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
str s = gi . Cvar_Get ( ev - > GetString ( 1 ) , " " , 0 ) - > string ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( strchr ( s . c_str ( ) , ' . ' ) )
{
for ( int i = 0 ; i < s . length ( ) ; i + + )
{
if ( s [ i ] = = ' . ' )
{
s [ i ] = 0 ;
}
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ev - > AddString ( s ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventSetCvar
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
gi . Cvar_Set ( ev - > GetString ( 1 ) , ev - > GetString ( 2 ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventThrow
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
if ( ! m_ScriptVM - > m_PrevCodePos ) {
2023-01-29 22:57:04 +01:00
return ;
}
2023-01-30 00:50:21 +01:00
if ( m_ScriptVM - > EventThrow ( ev ) )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
if ( m_ScriptVM - > State ( ) = = STATE_EXECUTION )
{
ScriptExecuteInternal ( ) ;
}
else
{
Stop ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
m_ScriptVM - > Resume ( ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
// we make sure this won't get deleted
SafePtr < ScriptThread > This = this ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
Stop ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! BroadcastEvent ( " " , * ev ) )
{
m_ScriptVM - > GetScriptClass ( ) - > EventThrow ( ev ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( This )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
delete this ;
2023-01-29 22:57:04 +01:00
}
}
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventWait
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Wait ( ev - > GetFloat ( 1 ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventWaitFrame
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
Wait ( level . frametime ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetSelf
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
ev - > AddListener ( m_ScriptVM - > GetScriptClass ( ) - > GetSelf ( ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : Println
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
if ( ! developer - > integer )
2023-01-29 22:57:04 +01:00
return ;
2023-01-30 00:50:21 +01:00
Print ( ev ) ;
gi . DPrintf ( " \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Print
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
if ( ! developer - > integer )
return ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( int i = 1 ; i < = ev - > NumArgs ( ) ; i + + )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
gi . DPrintf ( ev - > GetString ( i ) . c_str ( ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : MPrintln
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
SimpleEntity * m_Self = ( SimpleEntity * ) m_ScriptVM - > GetScriptClass ( ) - > GetSelf ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! m_Self | | ! m_Self - > isSubclassOf ( SimpleEntity ) )
2023-01-29 22:57:04 +01:00
{
return ;
}
2023-01-30 00:50:21 +01:00
MPrint ( ev ) ;
m_Self - > MPrintf ( " \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MPrint
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
SimpleEntity * m_Self = ( SimpleEntity * ) m_ScriptVM - > GetScriptClass ( ) - > GetSelf ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! m_Self | | ! m_Self - > isSubclassOf ( SimpleEntity ) )
2023-01-29 22:57:04 +01:00
{
return ;
}
2023-01-30 00:50:21 +01:00
for ( int i = 1 ; i < = ev - > NumArgs ( ) ; i + + )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
m_Self - > MPrintf ( ev - > GetString ( i ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : RandomFloat
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
ev - > AddFloat ( G_Random ( ev - > GetFloat ( 1 ) ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : RandomInt
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( G_Random ( ev - > GetInteger ( 1 ) ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : Spawn
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
Listener * listener = SpawnInternal ( ev ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( listener & & checkInheritance ( & Object : : ClassInfo , listener - > classinfo ( ) ) )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " You must specify an explicit classname for misc object tik models " ) ;
2023-01-29 22:57:04 +01:00
}
}
2023-01-30 00:50:21 +01:00
Listener * ScriptThread : : SpawnInternal
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
SpawnArgs args ;
str classname ;
Listener * l ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) < = 0 )
{
throw ScriptException ( " Usage: spawn entityname [keyname] [value]... " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
classname = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( getClassForID ( classname ) | | getClass ( classname ) )
{
args . setArg ( " classname " , classname ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else
{
if ( ! strstr ( classname . c_str ( ) , " .tik " ) )
{
classname . append ( " .tik " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
args . setArg ( " model " , classname ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( int i = 2 ; i < ev - > NumArgs ( ) ; i + = 2 )
{
args . setArg ( ev - > GetString ( i ) , ev - > GetString ( i + 1 ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! args . getClassDef ( ) )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " '%s' is not a valid entity name " , classname . c_str ( ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
const char * spawntarget = args . getArg ( " spawntarget " ) ;
if ( spawntarget )
{
SimpleEntity * target = G_FindTarget ( NULL , spawntarget ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! target )
{
throw ScriptException ( " Can't find targetname %s " , spawntarget ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
args . setArg ( " origin " , va ( " %f %f %f " , target - > origin [ 0 ] , target - > origin [ 1 ] , target - > origin [ 2 ] ) ) ;
args . setArg ( " angle " , va ( " %f " , target - > angles [ 1 ] ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
level . spawnflags = 0 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
const char * s = args . getArg ( " spawnflags " ) ;
if ( s ) {
level . spawnflags = atoi ( s ) ;
}
level . m_bScriptSpawn = true ;
l = args . Spawn ( ) ;
level . m_bScriptSpawn = false ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( level . m_bRejectSpawn )
{
level . m_bRejectSpawn = false ;
throw ScriptException ( " Spawn command rejected for %s " , classname . c_str ( ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
return l ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : SpawnReturn
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Listener * listener = SpawnInternal ( ev ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddListener ( listener ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( listener & & checkInheritance ( & Object : : ClassInfo , listener - > classinfo ( ) ) )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " You must specify an explicit classname for misc object tik models " ) ;
2023-01-29 22:57:04 +01:00
}
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventVectorAdd
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
ev - > AddVector ( ev - > GetVector ( 1 ) + ev - > GetVector ( 2 ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventVectorCloser
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventVectorCross
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
ev - > AddVector ( Vector : : Cross ( ev - > GetVector ( 1 ) , ev - > GetVector ( 2 ) ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventVectorDot
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Vector vector1 = ev - > GetVector ( 1 ) , vector2 = ev - > GetVector ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddVector ( Vector ( vector1 . x * vector2 . x , vector1 . y * vector2 . y , vector1 . z * vector2 . z ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventVectorLength
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
ev - > AddFloat ( ev - > GetVector ( 1 ) . length ( ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventVectorNormalize
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Vector vector = ev - > GetVector ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
vector . normalize ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddVector ( vector ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventVectorScale
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Vector vector = ev - > GetVector ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
vector * = ev - > GetFloat ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddVector ( vector ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventVectorSubtract
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
ev - > AddVector ( ev - > GetVector ( 1 ) - ev - > GetVector ( 2 ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventVectorToAngles
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
ev - > AddVector ( ev - > GetVector ( 1 ) . toAngles ( ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventVectorWithin
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Vector delta ;
float dist = ev - > GetFloat ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
delta = ev - > GetVector ( 1 ) - ev - > GetVector ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
// check squared distance
ev - > AddInteger ( ( ( delta * delta ) < ( dist * dist ) ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventGetBoundKey1
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int iKey1 ;
int iKey2 ;
const char * pszKeyName ;
str sCommand = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . Key_GetKeysForCommand ( sCommand , & iKey1 , & iKey2 ) ;
pszKeyName = gi . Key_KeynumToBindString ( iKey1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddString ( pszKeyName ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventGetBoundKey2
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int iKey1 ;
int iKey2 ;
const char * pszKeyName ;
str sCommand = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . Key_GetKeysForCommand ( sCommand , & iKey1 , & iKey2 ) ;
pszKeyName = gi . Key_KeynumToBindString ( iKey2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddString ( pszKeyName ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventLocConvertString
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
ev - > AddString ( gi . LV_ConvertString ( ev - > GetString ( 1 ) ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
# if defined ( GAME_DLL )
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : MapEvent
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
if ( level . mission_failed )
return ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
G_BeginIntermission ( ev - > GetString ( 1 ) , TRANS_BSP ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventSightTrace
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int content_mask = MASK_LINE ;
Vector start ;
Vector mins ;
Vector maxs ;
Vector end ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
mins = vec_zero ;
maxs = vec_zero ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
switch ( ev - > NumArgs ( ) )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
case 5 :
maxs = ev - > GetVector ( 5 ) ;
case 4 :
mins = ev - > GetVector ( 4 ) ;
case 3 :
if ( ev - > GetInteger ( 3 ) )
content_mask = MASK_SOLID ;
case 2 :
end = ev - > GetVector ( 2 ) ;
case 1 :
start = ev - > GetVector ( 1 ) ;
break ;
default :
throw ScriptException ( " Wrong number of arguments for sighttrace. " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
// call trace
ev - > AddInteger ( G_SightTrace ( start ,
mins ,
maxs ,
end ,
( gentity_t * ) NULL ,
( gentity_t * ) NULL ,
content_mask ,
false ,
" ScriptThread::EventSightTrace " ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventTrace
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int content_mask = MASK_LINE ;
Vector start ;
Vector mins ;
Vector maxs ;
Vector end ;
trace_t trace ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
mins = vec_zero ;
maxs = vec_zero ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
switch ( ev - > NumArgs ( ) )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
case 5 :
maxs = ev - > GetVector ( 5 ) ;
case 4 :
mins = ev - > GetVector ( 4 ) ;
case 3 :
if ( ev - > GetInteger ( 3 ) )
content_mask = MASK_SOLID ;
case 2 :
end = ev - > GetVector ( 2 ) ;
case 1 :
start = ev - > GetVector ( 1 ) ;
break ;
default :
throw ScriptException ( " Wrong number of arguments for trace. " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
// call trace
trace = G_Trace ( start ,
mins ,
maxs ,
end ,
NULL ,
content_mask ,
false ,
" ScriptThread::EventTrace " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddVector ( trace . endpos ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : TriggerEvent
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
ScriptVariable var ;
Entity * ent ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
var = ev - > GetValue ( 1 ) ;
var . CastConstArrayValue ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( int i = var . arraysize ( ) ; i > 0 ; i - - )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ent = var [ i ] - > entityValue ( ) ;
if ( ent )
{
Event * event = new Event ( EV_Activate ) ;
event - > AddEntity ( world ) ;
ent - > ProcessEvent ( event ) ;
}
2023-01-29 22:57:04 +01:00
}
}
2023-01-30 00:50:21 +01:00
# endif
void ScriptThread : : ServerEvent
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Event * event = new Event ( ev - > GetString ( 1 ) ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( int i = 2 ; i < = ev - > NumArgs ( ) ; i + + )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
event - > AddValue ( ev - > GetValue ( i ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ProcessScriptEvent ( event ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : StuffCommand
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
gi . SendConsoleCommand ( va ( " %s \n " , ev - > GetString ( 1 ) . c_str ( ) ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
# ifdef GAME_DLL
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void Showmenu ( str name , qboolean bForce )
{
gentity_t * ent ;
int i ;
if ( game . maxclients < = 0 ) {
2023-01-29 22:57:04 +01:00
return ;
}
2023-01-30 00:50:21 +01:00
for ( i = 0 , ent = g_entities ; i < game . maxclients ; i + + , ent + + )
{
if ( ! ent - > inuse | | ! ent - > client ) {
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . Showmenu ( i , name . c_str ( ) , bForce ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void Hidemenu ( str name , qboolean bForce )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
gentity_t * ent ;
int i ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( game . maxclients < = 0 ) {
2023-01-29 22:57:04 +01:00
return ;
}
2023-01-30 00:50:21 +01:00
for ( i = 0 , ent = g_entities ; i < game . maxclients ; i + + , ent + + )
{
if ( ! ent - > inuse | | ! ent - > client ) {
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . Hidemenu ( i , name . c_str ( ) , bForce ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptMaster : : AddMenu ( str name )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
m_menus . AddUniqueObject ( name ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptMaster : : RemoveMenu ( str name )
{
if ( m_menus . IndexOfObject ( name ) )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
m_menus . RemoveObject ( name ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptMaster : : LoadMenus ( void )
{
for ( int i = 1 ; i < = m_menus . NumObjects ( ) ; i + + )
{
Showmenu ( m_menus . ObjectAt ( i ) , true ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : CreateHUD
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int clientNum = - 1 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 0 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Player * player = ( Player * ) ev - > GetEntity ( 1 ) ;
if ( ! player | | ! player - > IsSubclassOfPlayer ( ) )
throw ScriptException ( " Invalid player entity! \n " ) ;
clientNum = player - > client - > ps . clientNum ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
Hud * hud = new Hud ( clientNum ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddListener ( hud ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : IPrintln
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
G_PrintToAllClients ( gi . LV_ConvertString ( ev - > GetString ( 1 ) ) , false ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : IPrintln_NoLoc
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
G_PrintToAllClients ( ev - > GetString ( 1 ) , false ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : IPrintlnBold
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
G_PrintToAllClients ( gi . LV_ConvertString ( ev - > GetString ( 1 ) ) , true ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : IPrintlnBold_NoLoc
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
G_PrintToAllClients ( ev - > GetString ( 1 ) , true ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
bool ScriptThread : : CanScriptTracePrint
(
void
)
{
return m_ScriptVM - > CanScriptTracePrint ( ) ;
}
void ScriptThread : : Earthquake
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
float duration = ev - > GetFloat ( 1 ) ;
float magnitude = ev - > GetFloat ( 2 ) ;
qboolean no_rampup = ev - > GetBoolean ( 3 ) ;
qboolean no_rampdown = ev - > GetBoolean ( 4 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 4 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Vector location = ev - > GetVector ( 5 ) ;
float radius = 1.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 5 ) {
radius = ev - > GetFloat ( 6 ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . SendServerCommand ( - 1 , " eq %f %f %d %d %f %f %f %f " , duration , magnitude , no_rampup , no_rampdown , location [ 0 ] , location [ 1 ] , location [ 2 ] , radius ) ;
} else {
gi . SendServerCommand ( - 1 , " eq %f %f %d %d " , duration , magnitude , no_rampup , no_rampdown ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIsAlive
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
Entity * ent = ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ent )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( ! ent - > IsDead ( ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else
{
ev - > AddInteger ( 0 ) ;
}
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : AddObjective
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
int index ;
int status ;
str text = " " ;
Vector location ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 1 ) ;
status = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index > 20 )
{
throw ScriptException ( " Index Out Of Range " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( status > 3 )
{
throw ScriptException ( " Invalid Status " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > IsNilAt ( 3 ) )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
text = Info_ValueForKey ( gi . GetConfigstring ( index - 1 + CS_OBJECTIVES ) , " text " ) ;
}
else
{
text = ev - > GetString ( 3 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
if ( ev - > IsNilAt ( 4 ) )
{
sscanf ( Info_ValueForKey ( gi . GetConfigstring ( index - 1 + CS_OBJECTIVES ) , " loc " ) , " %f %f %f " , & location . x , & location . y , & location . z ) ;
}
else
{
location = ev - > GetVector ( 4 ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
AddObjective ( index , status , text , location ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : AddObjective ( int index , int status , str text , Vector location )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
static int last_time ;
int flags ;
char szSend [ 2048 ] ;
char * sTmp ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
flags = 0 ;
sTmp = gi . GetConfigstring ( CS_OBJECTIVES + index ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
switch ( status )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
case 1 :
flags = 1 ;
break ;
case 2 :
sTmp = Info_ValueForKey ( sTmp , " flags " ) ;
if ( ! ( atoi ( sTmp ) & 2 ) )
{
if ( last_time ! = level . inttime )
{
gi . Printf ( " An objective has been added! \n " ) ;
last_time = level . inttime ;
}
}
flags = 2 ;
break ;
case 3 :
if ( last_time ! = level . inttime )
{
gi . Printf ( " An objective has been completed! \n " ) ;
last_time = level . inttime ;
}
if ( ! g_gametype - > integer )
{
if ( g_entities - > entity - > IsSubclassOfPlayer ( ) )
{
( ( Player * ) g_entities - > entity ) - > m_iObjectivesCompleted + + ;
}
}
flags = 4 ;
break ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
szSend [ 0 ] = 0 ;
Info_SetValueForKey ( szSend , " flags " , va ( " %i " , flags ) ) ;
Info_SetValueForKey ( szSend , " text " , text . c_str ( ) ) ;
Info_SetValueForKey ( szSend , " loc " , va ( " %f %f %f " , location [ 0 ] , location [ 1 ] , location [ 2 ] ) ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . SetConfigstring ( CS_OBJECTIVES + index , szSend ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : ClearObjectiveLocation
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ClearObjectiveLocation ( ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : ClearObjectiveLocation ( void )
{
level . m_vObjectiveLocation = vec_zero ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : SetObjectiveLocation
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
SetObjectiveLocation ( ev - > GetVector ( 1 ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : SetObjectiveLocation ( Vector vLocation )
{
level . m_vObjectiveLocation = vLocation ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : SetCurrentObjective
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int iObjective = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( iObjective > MAX_OBJECTIVES )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Index Out Of Range " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
SetCurrentObjective ( iObjective ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : SetCurrentObjective ( int iObjective )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
gi . SetConfigstring ( CS_CURRENT_OBJECTIVE , va ( " %i " , iObjective ) ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( iObjective = = - 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
level . m_vObjectiveLocation = vec_zero ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else
{
const char * s = gi . GetConfigstring ( CS_OBJECTIVES + iObjective ) ;
const char * loc = Info_ValueForKey ( s , " loc " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
sscanf ( loc , " %f %f %f " , & level . m_vObjectiveLocation [ 0 ] , & level . m_vObjectiveLocation [ 1 ] , & level . m_vObjectiveLocation [ 2 ] ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : AllAIOff
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
level . ai_on = qfalse ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : AllAIOn
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
level . ai_on = qtrue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventTeamWin
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
const_str team ;
int teamnum ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( g_gametype - > integer ! = GT_OBJECTIVE )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " 'teamwin' only valid for objective-based DM games " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
team = ev - > GetConstString ( 1 ) ;
if ( team = = STRING_ALLIES )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
teamnum = TEAM_ALLIES ;
}
else if ( team = = TEAM_AXIS )
{
teamnum = TEAM_AXIS ;
}
else
{
throw ScriptException ( " 'teamwin' must be called with 'axis' or 'allies' as its argument " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
dmManager . TeamWin ( teamnum ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : Angles_PointAt
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
Entity * pParent , * pEnt , * pTarget ;
Vector vDelta , vVec , vAngles ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
pParent = ev - > GetEntity ( 1 ) ;
pEnt = ev - > GetEntity ( 2 ) ;
pTarget = ev - > GetEntity ( 3 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( pParent )
{
vDelta = pEnt - > centroid - pTarget - > centroid ;
vVec [ 0 ] = DotProduct ( vDelta , pParent - > orientation [ 0 ] ) ;
vVec [ 1 ] = DotProduct ( vDelta , pParent - > orientation [ 1 ] ) ;
vVec [ 2 ] = DotProduct ( vDelta , pParent - > orientation [ 2 ] ) ;
}
else
{
vVec = pEnt - > centroid - pTarget - > centroid ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
VectorNormalize ( vVec ) ;
vectoangles ( vVec , vAngles ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddVector ( vAngles ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventEarthquake
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
earthquake_t e ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
e . duration = ( int ) ( ev - > GetFloat ( 1 ) * 1000.0f + 0.5f ) ;
if ( e . duration < = 0 ) {
return ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
e . magnitude = ev - > GetFloat ( 2 ) ;
e . no_rampup = ev - > GetBoolean ( 3 ) ;
e . no_rampdown = ev - > GetBoolean ( 4 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
e . starttime = level . inttime ;
e . endtime = level . inttime + e . duration ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
e . m_Thread = this ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
level . AddEarthquake ( & e ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : CueCamera
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
float switchTime ;
Entity * ent ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
switchTime = ev - > GetFloat ( 2 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
switchTime = 0 ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ent = ev - > GetEntity ( 1 ) ;
if ( ent )
{
SetCamera ( ent , switchTime ) ;
}
else
{
throw ScriptException ( " Camera named %s not found " , ev - > GetString ( 1 ) . c_str ( ) ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : CuePlayer
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
float switchTime ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 0 )
{
switchTime = ev - > GetFloat ( 1 ) ;
}
else
{
switchTime = 0 ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
SetCamera ( NULL , switchTime ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : FreezePlayer
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
level . playerfrozen = true ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : ReleasePlayer
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
level . playerfrozen = false ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventDrawHud
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
int i ;
gentity_t * ent ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
// TRIVIA: in mohaa, drawhud worked only for the first player
for ( i = 0 , ent = g_entities ; i < game . maxclients ; i + + , ent + + )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
if ( ! ent - > inuse | | ! ent - > entity | | ! ent - > client ) {
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > GetBoolean ( 1 ) )
{
ent - > client - > ps . pm_flags & = ~ PMF_NO_HUD ;
}
else
{
ent - > client - > ps . pm_flags | = PMF_NO_HUD ;
}
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventRadiusDamage
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
Vector origin = ev - > GetVector ( 1 ) ;
float damage = ev - > GetFloat ( 2 ) ;
float radius = ev - > GetFloat ( 3 ) ;
int constant_damage ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 3 )
{
constant_damage = ev - > GetInteger ( 4 ) ;
2023-01-29 22:57:04 +01:00
}
else
2023-01-30 00:50:21 +01:00
{
constant_damage = 0 ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
RadiusDamage ( origin , world , world , damage , NULL , MOD_EXPLOSION , radius , 0 , constant_damage ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : ForceMusicEvent
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
const char * current ;
const char * fallback ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
current = NULL ;
fallback = NULL ;
current = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 1 ) {
fallback = ev - > GetString ( 2 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ChangeMusic ( current , fallback , true ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventPrint3D
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
Vector origin ;
float scale ;
str string ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
origin = ev - > GetVector ( 1 ) ;
scale = ev - > GetFloat ( 2 ) ;
string = ev - > GetString ( 3 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
G_DebugString ( origin , scale , 1.0f , 1.0f , 1.0f , string ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : SoundtrackEvent
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ChangeSoundtrack ( ev - > GetString ( 1 ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : RestoreSoundtrackEvent
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
RestoreSoundtrack ( ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventBspTransition
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
str map = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( level . intermissiontime = = 0.0f )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
G_BeginIntermission ( map , TRANS_BSP ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventLevelTransition
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
str map = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( level . intermissiontime = = 0.0f )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
G_BeginIntermission ( map , TRANS_LEVEL ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventMissionTransition
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
str map = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( level . intermissiontime = = 0.0f )
{
G_BeginIntermission ( map , TRANS_MISSION ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Letterbox
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
level . m_letterbox_fraction = 1.0f / 8.0f ;
level . m_letterbox_time = ev - > GetFloat ( 1 ) ;
level . m_letterbox_time_start = ev - > GetFloat ( 1 ) ;
level . m_letterbox_dir = letterbox_in ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 1 )
level . m_letterbox_fraction = ev - > GetFloat ( 2 ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : ClearLetterbox
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
level . m_letterbox_time = level . m_letterbox_time_start ;
level . m_letterbox_dir = letterbox_out ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : SetLightStyle
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
lightStyles . SetLightStyle ( ev - > GetInteger ( 1 ) , ev - > GetString ( 2 ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FadeIn
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
level . m_fade_time_start = ev - > GetFloat ( 1 ) ;
level . m_fade_time = ev - > GetFloat ( 1 ) ;
level . m_fade_color [ 0 ] = ev - > GetFloat ( 2 ) ;
level . m_fade_color [ 1 ] = ev - > GetFloat ( 3 ) ;
level . m_fade_color [ 2 ] = ev - > GetFloat ( 4 ) ;
level . m_fade_alpha = ev - > GetFloat ( 5 ) ;
level . m_fade_type = fadein ;
level . m_fade_style = alphablend ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 5 )
{
level . m_fade_style = ( fadestyle_t ) ev - > GetInteger ( 6 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : ClearFade
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
level . m_fade_time = - 1 ;
level . m_fade_type = fadein ;
}
void ScriptThread : : FadeOut
(
Event * ev
)
{
level . m_fade_time_start = ev - > GetFloat ( 1 ) ;
level . m_fade_time = ev - > GetFloat ( 1 ) ;
level . m_fade_color [ 0 ] = ev - > GetFloat ( 2 ) ;
level . m_fade_color [ 1 ] = ev - > GetFloat ( 3 ) ;
level . m_fade_color [ 2 ] = ev - > GetFloat ( 4 ) ;
level . m_fade_alpha = ev - > GetFloat ( 5 ) ;
level . m_fade_type = fadeout ;
level . m_fade_style = alphablend ;
if ( ev - > NumArgs ( ) > 5 )
{
level . m_fade_style = ( fadestyle_t ) ev - > GetInteger ( 6 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : MusicEvent
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
const char * current ;
const char * fallback ;
current = NULL ;
fallback = NULL ;
current = ev - > GetString ( 1 ) ;
if ( ev - > NumArgs ( ) > 1 )
fallback = ev - > GetString ( 2 ) ;
ChangeMusic ( current , fallback , false ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MusicVolumeEvent
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
float volume ;
float fade_time ;
volume = ev - > GetFloat ( 1 ) ;
fade_time = ev - > GetFloat ( 2 ) ;
ChangeMusicVolume ( volume , fade_time ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : RestoreMusicVolumeEvent
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
float fade_time ;
fade_time = ev - > GetFloat ( 1 ) ;
RestoreMusicVolume ( fade_time ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : SetCinematic
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
G_StartCinematic ( ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : SetNonCinematic
(
Event * ev
)
{
G_StopCinematic ( ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : CenterPrint
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int j ;
gentity_t * other ;
for ( j = 0 ; j < game . maxclients ; j + + )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
other = & g_entities [ j ] ;
if ( other - > inuse & & other - > client )
{
gi . centerprintf ( other , ev - > GetString ( 1 ) ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
}
void ScriptThread : : LocationPrint
(
Event * ev
)
{
int j ;
gentity_t * other ;
int x , y ;
x = ev - > GetInteger ( 1 ) ;
y = ev - > GetInteger ( 2 ) ;
for ( j = 0 ; j < game . maxclients ; j + + )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
other = & g_entities [ j ] ;
if ( other - > inuse & & other - > client )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
gi . locationprintf ( other , x , y , ev - > GetString ( 3 ) ) ;
2023-01-29 22:57:04 +01:00
}
}
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : KillEnt
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int num ;
Entity * ent ;
if ( ev - > NumArgs ( ) ! = 1 )
{
throw ScriptException ( " No args passed in " ) ;
}
num = ev - > GetInteger ( 1 ) ;
if ( ( num < 0 ) | | ( num > = globals . max_entities ) )
{
throw ScriptException ( " Value out of range. Possible values range from 0 to %d. \n " , globals . max_entities ) ;
}
ent = G_GetEntity ( num ) ;
ent - > Damage ( world , world , ent - > max_health + 25 , vec_zero , vec_zero , vec_zero , 0 , 0 , 0 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : RemoveEnt
(
Event * ev
)
{
int num ;
Entity * ent ;
if ( ev - > NumArgs ( ) ! = 1 )
{
throw ScriptException ( " No args passed in " ) ;
}
num = ev - > GetInteger ( 1 ) ;
if ( ( num < 0 ) | | ( num > = globals . max_entities ) )
{
throw ScriptException ( " Value out of range. Possible values range from 0 to %d. \n " , globals . max_entities ) ;
}
ent = G_GetEntity ( num ) ;
ent - > PostEvent ( Event ( EV_Remove ) , 0 ) ;
}
void ScriptThread : : KillClass
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int except ;
2023-01-29 22:57:04 +01:00
str classname ;
2023-01-30 00:50:21 +01:00
gentity_t * from ;
Entity * ent ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) < 1 )
{
throw ScriptException ( " No args passed in " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
classname = ev - > GetString ( 1 ) ;
except = 0 ;
if ( ev - > NumArgs ( ) = = 2 )
{
except = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
for ( from = & g_entities [ game . maxclients ] ; from < & g_entities [ globals . num_entities ] ; from + + )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
if ( ! from - > inuse )
{
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
assert ( from - > entity ) ;
ent = from - > entity ;
if ( ent - > entnum = = except )
{
2023-01-29 22:57:04 +01:00
continue ;
}
2023-01-30 00:50:21 +01:00
if ( ent - > inheritsFrom ( classname . c_str ( ) ) )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ent - > Damage ( world , world , ent - > max_health + 25 , vec_zero , vec_zero , vec_zero , 0 , 0 , 0 ) ;
2023-01-29 22:57:04 +01:00
}
}
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : RemoveClass
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int except ;
str classname ;
gentity_t * from ;
Entity * ent ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) < 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " No args passed in " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
classname = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
except = 0 ;
if ( ev - > NumArgs ( ) = = 2 )
{
except = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
for ( from = & g_entities [ game . maxclients ] ; from < & g_entities [ globals . num_entities ] ; from + + )
{
if ( ! from - > inuse )
{
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
assert ( from - > entity ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ent = from - > entity ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ent - > entnum = = except )
continue ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ent - > inheritsFrom ( classname . c_str ( ) ) )
{
ent - > PostEvent ( Event ( EV_Remove ) , 0 ) ;
}
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : CameraCommand
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Event * e ;
const char * cmd ;
int i ;
int n ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! ev - > NumArgs ( ) )
{
throw ScriptException ( " Usage: cam [command] [arg 1]...[arg n] " ) ;
}
cmd = ev - > GetString ( 1 ) ;
if ( Event : : FindEventNum ( cmd ) )
{
e = new ConsoleEvent ( cmd ) ;
n = ev - > NumArgs ( ) ;
for ( i = 2 ; i < = n ; i + + )
{
e - > AddToken ( ev - > GetToken ( i ) ) ;
}
CameraMan . ProcessEvent ( e ) ;
}
else
{
throw ScriptException ( " Unknown camera command '%s'. \n " , cmd ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MissionFailed
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
G_MissionFailed ( ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventHudDrawShader
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int index = - 1 ;
2023-02-01 00:28:40 +01:00
str shadername ;
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 1 ) ;
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for huddraw_shader! \n " ) ;
}
shadername = ev - > GetString ( 2 ) ;
HudDrawShader ( index , shadername ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventHudDrawAlign
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int index = - 1 ;
int h_alignement = - 1 ;
int v_alignement = - 1 ;
str h_align ;
str v_align ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for huddraw_align! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
h_align = ev - > GetString ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! h_align )
{
throw ScriptException ( " h_align is NULL for huddraw_align! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
v_align = ev - > GetString ( 3 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! v_align )
{
throw ScriptException ( " v_align is NULL for huddraw_align! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( h_align = = " left " ) {
h_alignement = 0 ;
} else if ( h_align = = " center " ) {
h_alignement = 1 ;
} else if ( h_align = = " right " ) {
h_alignement = 2 ;
}
else
{
throw ScriptException ( " Wrong alignement h_align string for huddraw_align! \n " ) ;
}
if ( v_align = = " top " )
{
v_alignement = 0 ;
} else if ( v_align = = " center " ) {
v_alignement = 1 ;
} else if ( v_align = = " bottom " ) {
v_alignement = 2 ;
} else {
throw ScriptException ( " Wrong alignement v_align string for huddraw_align! \n " ) ;
}
HudDrawAlign ( index , h_alignement , v_alignement ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventHudDrawRect
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int index = - 1 ;
int x = 0 ;
int y = 0 ;
int width = 0 ;
int height = 0 ;
index = ev - > GetInteger ( 1 ) ;
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for huddraw_rect! \n " ) ;
}
x = ev - > GetInteger ( 2 ) ;
y = ev - > GetInteger ( 3 ) ;
width = ev - > GetInteger ( 4 ) ;
height = ev - > GetInteger ( 5 ) ;
HudDrawRect ( index , x , y , width , height ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventHudDrawVirtualSize
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int index = - 1 ;
int virt = - 1 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong index for huddraw_virtualsize! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
virt = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( virt ! = 0 ) virt = 1 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
HudDrawVirtualSize ( index , virt ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventHudDrawColor
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int numArgs = - 1 ;
int index = - 1 ;
Vector color ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 1 ) ;
if ( index < 0 & & index > 255 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong index for ihuddraw_color! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
color [ 0 ] = ev - > GetFloat ( 2 ) ; // red
color [ 1 ] = ev - > GetFloat ( 3 ) ; // green
color [ 2 ] = ev - > GetFloat ( 4 ) ; // blue
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
Vector : : Clamp ( color , vec_zero , Vector ( 1 , 1 , 1 ) ) ;
HudDrawColor ( index , color ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventHudDrawAlpha
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int index = - 1 ;
float alpha = 0.0f ;
index = ev - > GetInteger ( 1 ) ;
if ( index < 0 & & index > 255 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong index for ihuddraw_alpha! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
alpha = ev - > GetFloat ( 2 ) ;
Q_clamp ( alpha , 0 , 1 ) ;
HudDrawAlpha ( index , alpha ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventHudDrawString
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int index = - 1 ;
str string ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 1 ) ;
if ( index < 0 & & index > 255 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong index for ihuddraw_string! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
string = ev - > GetString ( 2 ) ;
HudDrawString ( index , string ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventHudDrawFont
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
int index = - 1 ;
str fontname ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for ihuddraw_font! \n " ) ;
}
fontname = ev - > GetString ( 2 ) ;
HudDrawFont ( index , fontname ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FadeSound
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
// params
float delaytime ;
float min_vol ;
Player * player ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
// variables
float time ;
// code
delaytime = ev - > GetFloat ( 1 ) ;
min_vol = ev - > GetFloat ( 2 ) ;
if ( ev - > NumArgs ( ) > 2 ) {
player = ( Player * ) ev - > GetEntity ( 3 ) ;
} else {
player = NULL ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
time = delaytime * 1000.0f ;
2023-02-07 20:49:31 +01:00
gi . SendServerCommand ( player ! = nullptr ? player - > edict - g_entities : 0 ,
" fadesound2 %0.2f %f " , time , min_vol ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : RestoreSound
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
// params
float delaytime ;
float max_vol ;
Player * player ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
// variables
float time ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
// code
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
delaytime = ev - > GetFloat ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 1 )
max_vol = ev - > GetFloat ( 2 ) ;
else
max_vol = 1.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 2 ) {
player = ( Player * ) ev - > GetEntity ( 3 ) ;
} else {
player = NULL ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
time = delaytime * 1000.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . SendServerCommand ( player ! = NULL ? player - > edict - g_entities : NULL ,
" restoresound %0.2f %f " , time , max_vol ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventHudDraw3d
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int index ;
float * tmp ;
vec3_t vector ;
int ent_num ;
qboolean bAlwaysShow , bDepth ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for huddraw_3d! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
tmp = ev - > GetVector ( 2 ) ;
memcpy ( & vector , tmp , sizeof ( vec3_t ) ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ent_num = ev - > GetInteger ( 3 ) ;
bAlwaysShow = ev - > GetInteger ( 4 ) ;
bDepth = ev - > GetInteger ( 5 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
HudDraw3d ( index , vector , ent_num , bAlwaysShow , bDepth ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventHudDrawTimer
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int index ;
float duration ;
float fade_out_time ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 1 ) ;
if ( index < 0 & & index > 255 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong index for huddraw_timer! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
duration = ev - > GetFloat ( 2 ) ;
fade_out_time = ev - > GetFloat ( 3 ) ;
HudDrawTimer ( index , duration , fade_out_time ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : CanSwitchTeams
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
qboolean bAllow = ev - > GetBoolean ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
disable_team_change = ! bAllow ;
if ( ev - > NumArgs ( ) > 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
qboolean bAllow2 = ev - > GetBoolean ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
disable_team_spectate = ! bAllow2 ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetEntity
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int entnum = - 1 ;
Entity * ent ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
entnum = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( entnum < 0 | | entnum > globals . max_entities ) {
throw ScriptException ( " Entity number %d out of scope! \n " , entnum ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ent = G_GetEntity ( entnum ) ;
ev - > AddEntity ( ent ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetPlayerNetname
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Entity * ent = NULL ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ent = ( Entity * ) ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ent = = NULL )
{
ev - > AddString ( " " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
return ;
}
else if ( ent - > client = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddString ( " " ) ;
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ev - > AddString ( ent - > client - > pers . netname ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetPlayerIP
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Entity * ent = NULL ;
char * ip = NULL ;
char ip_buff [ 65 ] ;
ent = ( Entity * ) ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ent = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddString ( " NIL " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else if ( ent - > client = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddString ( " NIL " ) ;
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ip = ent - > client - > pers . ip ;
2023-01-29 22:57:04 +01:00
2023-02-01 19:29:13 +01:00
sprintf ( ip_buff , " %s:%i " , ip , ent - > client - > pers . port ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddString ( ip_buff ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetPlayerPing
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
Entity * ent = NULL ;
int ping = - 1 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ent = ( Entity * ) ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ent = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Player entity is NULL for getping! \n " ) ;
}
else if ( ent - > client = = NULL )
{
throw ScriptException ( " Entity is probably not of player type - getping \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ping = ent - > client - > ps . ping ;
ev - > AddInteger ( ping ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetPlayerClientNum
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Entity * ent = NULL ;
int cl_num = - 1 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ent = ( Entity * ) ev - > GetEntity ( 1 ) ;
if ( ent = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Player entity is NULL for getclientnum! \n " ) ;
}
else if ( ent - > client = = NULL )
{
throw ScriptException ( " Entity is probably not of player type - getclientnum \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
cl_num = ent - > client - > ps . clientNum ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( cl_num ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetAreaEntities
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Vector origin ;
Vector mins ;
Vector maxs ;
Vector o_min ;
Vector o_max ;
int touch [ MAX_GENTITIES ] ;
int count ;
int j = 0 ;
ScriptVariable * ref = new ScriptVariable , * array = new ScriptVariable ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
origin = ev - > GetVector ( 1 ) ;
mins = ev - > GetVector ( 2 ) ;
maxs = ev - > GetVector ( 3 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
o_min = origin + mins ;
o_max = origin + maxs ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
count = gi . AreaEntities ( o_min , o_max , touch , MAX_GENTITIES ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ref - > setRefValue ( array ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( int i = 0 ; i < count ; i + + )
{
Entity * entity = G_GetEntity ( touch [ i ] ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( entity = = NULL ) {
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ScriptVariable * index = new ScriptVariable , * value = new ScriptVariable ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index - > setIntValue ( j ) ;
value - > setListenerValue ( entity ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ref - > setArrayAt ( * index , * value ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
j + + ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddValue ( * array ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetEntArray
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
str name = ev - > GetString ( 1 ) ;
str key = ev - > GetString ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ScriptVariable array ;
ScriptVariable index , value ;
gentity_t * gentity = globals . gentities ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
Event * event = new Event ( key , EV_GETTER ) ;
qboolean useEvent = event ! = NULL ;
qboolean createEvent = false ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! event - > eventnum )
{
delete event ;
useEvent = false ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
int x = 0 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( int i = 0 ; i < globals . num_entities ; i + + , gentity + + )
{
ScriptVariable returnValue ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! gentity - > inuse | | gentity - > entity = = NULL ) {
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( createEvent )
{
event = new Event ( key , EV_GETTER ) ;
createEvent = false ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
Entity * entity = gentity - > entity ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( useEvent ) {
createEvent = true ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! useEvent )
{
// Now look for variables if predefined keys are not specified
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ScriptVariableList * vars = entity - > Vars ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( vars = = NULL ) {
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
// Get the variable from the key
ScriptVariable * variable = vars - > GetVariable ( key ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( variable = = NULL ) {
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
// Check if it matches with the name
if ( variable - > stringValue ( ) = = name ) {
continue ;
}
}
else
{
const char * value = NULL ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
returnValue = entity - > ProcessEventReturn ( event ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! event - > NumArgs ( ) ) {
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
value = returnValue . stringValue ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( value = = NULL ) {
continue ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( strcmp ( value , name ) ! = 0 ) {
continue ;
}
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index . setIntValue ( x ) ;
value . setListenerValue ( entity ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
array . setArrayAt ( index , value ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
x + + ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ev - > AddValue ( array ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIHudDraw3d
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
Player * player ;
int index ;
float * tmp ;
vec3_t vector ;
int ent_num ;
qboolean bAlwaysShow , bDepth ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
player = ( Player * ) ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( player = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Player entity is NULL for ihuddraw_3d! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for ihuddraw_3d! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
tmp = ev - > GetVector ( 3 ) ;
memcpy ( & vector , tmp , sizeof ( vec3_t ) ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ent_num = ev - > GetInteger ( 4 ) ;
bAlwaysShow = ev - > GetInteger ( 5 ) ;
bDepth = ev - > GetInteger ( 6 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
iHudDraw3d ( player - > edict - g_entities , index , vector , ent_num , bAlwaysShow , bDepth ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIHudDrawTimer
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
Player * player ;
int index ;
float duration ;
float fade_out_time ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
player = ( Player * ) ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( player = = NULL )
{
throw ScriptException ( " Player entity is NULL for ihuddraw_timer! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for ihuddraw_timer! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
duration = ev - > GetFloat ( 3 ) ;
fade_out_time = ev - > GetFloat ( 4 ) ;
iHudDrawTimer ( player - > edict - g_entities , index , duration , fade_out_time ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIHudDrawShader
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = - 1 ;
int index = - 1 ;
Entity * player = NULL ;
2023-02-01 00:28:40 +01:00
str shadername ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 3 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for ihuddraw_shader! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
player = ( Entity * ) ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( player = = NULL )
{
throw ScriptException ( " Player entity is NULL for ihuddraw_shader! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong index for ihuddraw_shader! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
shadername = ev - > GetString ( 3 ) ;
iHudDrawShader ( player - > edict - g_entities , index , shadername ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIHudDrawAlign
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = - 1 ;
int index = - 1 ;
int h_alignement = - 1 ;
int v_alignement = - 1 ;
Entity * player = NULL ;
str h_align ;
str v_align ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 4 )
{
throw ScriptException ( " Wrong arguments count for ihuddraw_align! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
player = ( Entity * ) ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( player = = NULL )
{
throw ScriptException ( " Player entity is NULL for ihuddraw_align! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for ihuddraw_align! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
h_align = ev - > GetString ( 3 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! h_align )
{
throw ScriptException ( " h_align is NULL for ihuddraw_align! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
v_align = ev - > GetString ( 4 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! v_align )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " v_align is NULL for ihuddraw_align! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
if ( h_align = = " left " )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
h_alignement = 0 ;
}
else if ( h_align = = " center " )
{
h_alignement = 1 ;
}
else if ( h_align = = " right " )
{
h_alignement = 2 ;
}
else
{
throw ScriptException ( " Wrong alignement h_align string for ihuddraw_align! \n " ) ;
}
if ( v_align = = " top " )
{
v_alignement = 0 ;
}
else if ( v_align = = " center " )
{
v_alignement = 1 ;
}
else if ( v_align = = " bottom " )
{
v_alignement = 2 ;
}
else
{
throw ScriptException ( " Wrong alignement v_align string for ihuddraw_align! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
iHudDrawAlign ( player - > edict - g_entities , index , h_alignement , v_alignement ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIHudDrawRect
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = - 1 ;
int index = - 1 ;
Entity * player = NULL ;
int x = 0 ;
int y = 0 ;
int width = 0 ;
int height = 0 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
if ( numArgs ! = 6 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for ihuddraw_rect! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
player = ( Entity * ) ev - > GetEntity ( 1 ) ;
if ( player = = NULL )
{
throw ScriptException ( " Player entity is NULL for ihuddraw_rect! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for ihuddraw_rect! \n " ) ;
}
x = ev - > GetInteger ( 3 ) ;
y = ev - > GetInteger ( 4 ) ;
width = ev - > GetInteger ( 5 ) ;
height = ev - > GetInteger ( 6 ) ;
iHudDrawRect ( player - > edict - g_entities , index , x , y , width , height ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIHudDrawVirtualSize
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = - 1 ;
int index = - 1 ;
Entity * player = NULL ;
int virt = - 1 ;
numArgs = ev - > NumArgs ( ) ;
if ( numArgs ! = 3 )
{
throw ScriptException ( " Wrong arguments count for ihuddraw_virtualsize! \n " ) ;
}
player = ( Entity * ) ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( player = = NULL )
{
throw ScriptException ( " Player entity is NULL for ihuddraw_virtualsize! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for ihuddraw_virtualsize! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
virt = ev - > GetInteger ( 3 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( virt ! = 0 ) virt = 1 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
iHudDrawVirtualSize ( player - > edict - g_entities , index , virt ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIHudDrawColor
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = - 1 ;
int index = - 1 ;
Entity * player = NULL ;
float color [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 5 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for ihuddraw_color! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
player = ( Entity * ) ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( player = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Player entity is NULL for ihuddraw_color! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 )
{
throw ScriptException ( " Wrong index for ihuddraw_color! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
color [ 0 ] = ev - > GetFloat ( 3 ) ; // red
color [ 1 ] = ev - > GetFloat ( 4 ) ; // green
color [ 2 ] = ev - > GetFloat ( 5 ) ; // blue
iHudDrawColor ( player - > edict - g_entities , index , color ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIHudDrawAlpha
2023-01-29 22:57:04 +01:00
(
2023-01-30 00:50:21 +01:00
Event * ev
2023-01-29 22:57:04 +01:00
)
{
2023-01-30 00:50:21 +01:00
int numArgs = - 1 ;
int index = - 1 ;
Entity * player = NULL ;
float alpha = 0.0f ;
numArgs = ev - > NumArgs ( ) ;
if ( numArgs ! = 3 )
{
throw ScriptException ( " Wrong arguments count for ihuddraw_alpha! \n " ) ;
}
player = ( Entity * ) ev - > GetEntity ( 1 ) ;
if ( player = = NULL ) {
throw ScriptException ( " Player entity is NULL for ihuddraw_alpha! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( index < 0 & & index > 255 ) {
throw ScriptException ( " Wrong index for ihuddraw_alpha! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
alpha = ev - > GetFloat ( 3 ) ;
iHudDrawAlpha ( player - > edict - g_entities , index , alpha ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIHudDrawString
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = - 1 ;
int index = - 1 ;
Entity * player = NULL ;
str string ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 3 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for ihuddraw_string! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
player = ( Entity * ) ev - > GetEntity ( 1 ) ;
if ( player = = NULL )
{
throw ScriptException ( " Player entity is NULL for ihuddraw_string! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 2 ) ;
if ( index < 0 & & index > 255 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong index for ihuddraw_string! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
string = ev - > GetString ( 3 ) ;
iHudDrawString ( player - > edict - g_entities , index , string ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIHudDrawFont
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int index ;
Entity * player = NULL ;
str fontname ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) ! = 3 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for ihuddraw_font! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
player = ( Entity * ) ev - > GetEntity ( 1 ) ;
if ( player = = NULL )
{
throw ScriptException ( " Player entity is NULL for ihuddraw_font! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
index = ev - > GetInteger ( 2 ) ;
if ( index < 0 & & index > 255 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong index for ihuddraw_font! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
fontname = ev - > GetString ( 3 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
iHudDrawFont ( player - > edict - g_entities , index , fontname ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIsOnGround
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Entity * entity = ev - > GetEntity ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( entity - > groundentity ! = NULL ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIsOutOfBounds
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
Entity * entity = ev - > GetEntity ( 1 ) ;
int areanum = gi . AreaForPoint ( entity - > origin ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( areanum = = - 1 ) {
ev - > AddInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else {
ev - > AddInteger ( 0 ) ;
2023-01-29 22:57:04 +01:00
}
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : TeamGetScore
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
str teamname = ev - > GetString ( 1 ) ;
DM_Team * team = dmManager . GetTeam ( teamname ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! team )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Invalid team \" %s \" " , teamname . c_str ( ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
if ( team ) {
ev - > AddInteger ( team - > m_teamwins ) ;
2023-01-29 22:57:04 +01:00
}
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : TeamSetScore
2023-01-29 22:57:04 +01:00
(
Event * ev
)
{
2023-01-30 00:50:21 +01:00
str teamname ;
DM_Team * team ;
int score ;
qboolean bAdd = false ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
teamname = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
team = dmManager . GetTeam ( teamname ) ;
if ( ! team )
{
throw ScriptException ( " Invalid team \" %s \" " , teamname . c_str ( ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
score = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 2 ) {
bAdd = ev - > GetInteger ( 3 ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( bAdd )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
team - > m_iKills + = score ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( g_gametype - > integer < 3 ) {
team - > m_teamwins + = score ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
}
else
{
team - > m_iKills = score ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( g_gametype - > integer < 3 ) {
team - > m_teamwins = score ;
}
}
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
# endif
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : CharToInt
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
str c = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( c [ 0 ] ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Conprintf
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
gi . Printf ( " %s " , ev - > GetString ( 1 ) . c_str ( ) ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileOpen
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
int numArgs = - 1 ;
2023-02-01 00:28:40 +01:00
str filename ;
str accesstype ;
2023-01-30 00:50:21 +01:00
FILE * f = NULL ;
char buf [ 16 ] = { 0 } ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 2 )
throw ScriptException ( " Wrong arguments count for fopen! \n " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( scriptfiles - > integer = = 32 )
throw ScriptException ( " Maximum count (32) of opened files is reached . Close at least one of them , to open new file - fopen ! \ n " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
filename = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
accesstype = ev - > GetString ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
f = fopen ( filename , accesstype ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( f = = NULL )
{
ev - > AddInteger ( 0 ) ;
return ;
}
else
{
ev - > AddInteger ( ( int ) ( size_t ) f ) ;
sprintf ( buf , " %i " , scriptfiles - > integer + 1 ) ;
gi . Cvar_Set ( " sv_scriptfiles " , buf ) ;
return ;
}
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileWrite
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileRead
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileClose
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
int id = 0 ;
int numArgs = 0 ;
int ret = 0 ;
FILE * f = NULL ;
char buf [ 16 ] = { 0 } ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
throw ScriptException ( " Wrong arguments count for fclose! \n " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
/*if( (int)scriptFiles[0].f != id && (int)scriptFiles[1].f != id )
{
gi . Printf ( " Wrong file handle for fclose! \n " ) ;
return ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ( int ) scriptFiles [ 0 ] . f = = id )
{
scriptFiles [ 0 ] . inUse = 0 ;
fclose ( scriptFiles [ 0 ] . f ) ;
return ;
}
else if ( ( int ) scriptFiles [ 1 ] . f = = id )
{
scriptFiles [ 1 ] . inUse = 0 ;
fclose ( scriptFiles [ 1 ] . f ) ;
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else
{
gi . Printf ( " Unknown error while closing file - fclose! \n " ) ;
return ;
} */
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
f = ( FILE * ) id ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( f = = NULL ) {
throw ScriptException ( " File handle is NULL for fclose! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ret = fclose ( f ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ret = = 0 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( 0 ) ;
sprintf ( buf , " %i " , scriptfiles - > integer - 1 ) ;
gi . Cvar_Set ( " sv_scriptfiles " , buf ) ;
return ;
2023-01-29 22:57:04 +01:00
}
else
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( ret ) ;
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileEof
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
int ret = 0 ;
FILE * f = NULL ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 ) {
throw ScriptException ( " Wrong arguments count for feof! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
f = ( FILE * ) id ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ret = feof ( f ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( ret ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileSeek
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
int pos = 0 ;
long int offset = 0 ;
int ret = 0 ;
FILE * f = NULL ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 3 ) {
throw ScriptException ( " Wrong arguments count for fseek! \n " ) ;
}
id = ev - > GetInteger ( 1 ) ;
f = ( FILE * ) id ;
offset = ev - > GetInteger ( 2 ) ;
if ( offset < 0 ) {
throw ScriptException ( " Wrong file offset! Should be starting from 0. - fseek \n " ) ;
}
pos = ev - > GetInteger ( 3 ) ;
if ( pos ! = 0 & & pos ! = 1 & & pos ! = 2 ) {
throw ScriptException ( " Wrong file offset start! Should be between 0 - 2! - fseek \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ret = fseek ( f , offset , pos ) ;
ev - > AddInteger ( ret ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileTell
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
long int ret = 0 ;
FILE * f = NULL ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 ) {
throw ScriptException ( " Wrong arguments count for ftell! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
f = ( FILE * ) id ;
ret = ftell ( f ) ;
ev - > AddInteger ( ret ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileRewind
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
long int ret = 0 ;
FILE * f = NULL ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 ) {
throw ScriptException ( " Wrong arguments count for frewind! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
f = ( FILE * ) id ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
rewind ( f ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : FilePutc
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
int id = 0 ;
int numArgs = 0 ;
int ret = 0 ;
FILE * f = NULL ;
int c = 0 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
if ( numArgs ! = 2 ) {
throw ScriptException ( " Wrong arguments count for fputc! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
f = ( FILE * ) id ;
c = ev - > GetInteger ( 2 ) ;
ret = fputc ( ( char ) c , f ) ;
ev - > AddInteger ( ret ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FilePuts
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
int ret = 0 ;
FILE * f = NULL ;
str c ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 2 ) {
throw ScriptException ( " Wrong arguments count for fputs! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
f = ( FILE * ) id ;
c = ev - > GetString ( 2 ) ;
//gi.Printf("Putting line into a file\n");
ret = fputs ( c , f ) ;
//gi.Printf("Ret val: %i\n", ret);
ev - > AddInteger ( ret ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileGetc
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
int ret = 0 ;
FILE * f = NULL ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
if ( numArgs ! = 1 ) {
throw ScriptException ( " Wrong arguments count for fgetc! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
f = ( FILE * ) id ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ret = fgetc ( f ) ;
ev - > AddInteger ( ret ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileGets
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
int maxCount = 0 ;
FILE * f = NULL ;
char * c = NULL ;
char * buff = NULL ;
2023-01-29 22:57:04 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 2 ) {
throw ScriptException ( " Wrong arguments count for fgets! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
f = ( FILE * ) id ;
maxCount = ev - > GetInteger ( 2 ) ;
if ( maxCount < = 0 ) {
throw ScriptException ( " Maximum buffer size should be higher than 0! - fgets \n " ) ;
}
buff = ( char * ) gi . Malloc ( maxCount + 1 ) ;
if ( buff = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Failed to allocate memory during fputs scriptCommand text buffer initialization! Try setting maximum buffer length lower. \n " ) ;
ev - > AddInteger ( - 1 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
memset ( buff , 0 , maxCount + 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
c = fgets ( buff , maxCount , f ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( c = = NULL )
ev - > AddString ( " " ) ;
else
ev - > AddString ( c ) ;
gi . Free ( buff ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileError
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
int ret = 0 ;
FILE * f = NULL ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 ) {
throw ScriptException ( " Wrong arguments count for ferror! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
f = ( FILE * ) id ;
ret = ferror ( f ) ;
ev - > AddInteger ( ret ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileFlush
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
int ret = 0 ;
FILE * f = NULL ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 ) {
throw ScriptException ( " Wrong arguments count for fflush! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
f = ( FILE * ) id ;
ret = fflush ( f ) ;
ev - > AddInteger ( ret ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileExists
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
FILE * f = 0 ;
str filename ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 ) {
throw ScriptException ( " Wrong arguments count for fexists! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
filename = ev - > GetString ( 1 ) ;
if ( filename = = NULL ) {
throw ScriptException ( " Empty file name passed to fexists! \n " ) ;
}
f = fopen ( filename , " r " ) ;
if ( f ) {
fclose ( f ) ;
ev - > AddInteger ( 1 ) ;
}
else {
ev - > AddInteger ( 0 ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileReadAll
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
FILE * f = NULL ;
char * ret = NULL ;
long currentPos = 0 ;
size_t size = 0 ;
size_t sizeRead = 0 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 ) {
throw ScriptException ( " Wrong arguments count for freadall! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
f = ( FILE * ) id ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
currentPos = ftell ( f ) ;
fseek ( f , 0 , SEEK_END ) ;
size = ftell ( f ) ;
fseek ( f , currentPos , SEEK_SET ) ;
ret = ( char * ) gi . Malloc ( sizeof ( char ) * size + 1 ) ;
if ( ret = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( - 1 ) ;
throw ScriptException ( " Error while allocating memory buffer for file content - freadall! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
sizeRead = fread ( ret , 1 , size , f ) ;
ret [ sizeRead ] = ' \0 ' ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddString ( ret ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . Free ( ret ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileSaveAll
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
FILE * f = NULL ;
size_t sizeWrite = 0 ;
str text ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 2 ) {
throw ScriptException ( " Wrong arguments count for fsaveall! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
id = ev - > GetInteger ( 1 ) ;
f = ( FILE * ) id ;
text = ev - > GetString ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( text = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( - 1 ) ;
throw ScriptException ( " Text to be written is NULL - fsaveall! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
sizeWrite = fwrite ( text , 1 , strlen ( text ) , f ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( ( int ) sizeWrite ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileRemove
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
int ret = 0 ;
str filename ;
2023-01-29 22:57:04 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 ) {
throw ScriptException ( " Wrong arguments count for fremove! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
filename = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( filename = = NULL ) {
throw ScriptException ( " Empty file name passed to fremove! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ret = remove ( filename ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( ret ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileRename
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int id = 0 ;
int numArgs = 0 ;
int ret = 0 ;
str oldfilename , newfilename ;
2023-01-29 22:57:04 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 2 ) {
throw ScriptException ( " Wrong arguments count for frename! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
oldfilename = ev - > GetString ( 1 ) ;
newfilename = ev - > GetString ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! oldfilename ) {
throw ScriptException ( " Empty old file name passed to frename! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
if ( ! newfilename ) {
throw ScriptException ( " Empty new file name passed to frename! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ret = rename ( oldfilename , newfilename ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( ret ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileCopy
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
size_t n = 0 ;
int numArgs = 0 ;
unsigned int ret = 0 ;
str filename , copyfilename ;
FILE * f = NULL , * fCopy = NULL ;
char buffer [ 4096 ] ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 2 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for fcopy! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
filename = ev - > GetString ( 1 ) ;
copyfilename = ev - > GetString ( 2 ) ;
if ( ! filename )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Empty file name passed to fcopy! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
if ( copyfilename )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Empty copy file name passed to fcopy! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
f = fopen ( filename , " rb " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( f = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( - 1 ) ;
throw ScriptException ( " Could not open \" %s \" for copying - fcopy! \n " , filename . c_str ( ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
fCopy = fopen ( copyfilename , " wb " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( fCopy = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
fclose ( f ) ;
ev - > AddInteger ( - 2 ) ;
throw ScriptException ( " Could not open \" %s \" for copying - fcopy! \n " , copyfilename . c_str ( ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
while ( ( n = fread ( buffer , sizeof ( char ) , sizeof ( buffer ) , f ) ) > 0 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
if ( fwrite ( buffer , sizeof ( char ) , n , fCopy ) ! = n )
{
fclose ( f ) ;
fflush ( fCopy ) ;
fclose ( fCopy ) ;
ev - > AddInteger ( - 3 ) ;
throw ScriptException ( " There was an error while copying files - fcopy! \n " ) ;
}
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
fclose ( f ) ;
fflush ( fCopy ) ;
fclose ( fCopy ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( 0 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileReadPak
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
str filename ;
char * content = NULL ;
int numArgs = 0 ;
int ret = 0 ;
2023-01-29 22:57:04 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for freadpak! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
filename = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( filename = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Filename is NULL - freadpak! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ret = gi . FS_ReadFile ( filename , ( void * * ) & content , qtrue ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( content = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( - 1 ) ;
throw ScriptException ( " Error while reading pak file content - freadpak! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ev - > AddString ( content ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileList
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int i = 0 , numArgs = 0 ;
const char * path = NULL ;
2023-02-01 00:28:40 +01:00
str extension ;
2023-01-30 00:50:21 +01:00
int wantSubs = 0 ;
int numFiles = 0 ;
char * * list = NULL ;
ScriptVariable * ref = new ScriptVariable ;
ScriptVariable * array = new ScriptVariable ;
2023-01-29 22:57:04 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 3 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for flist! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
path = ev - > GetString ( 1 ) ;
extension = ev - > GetString ( 2 ) ;
wantSubs = ev - > GetInteger ( 3 ) ;
list = gi . FS_ListFiles ( path , extension , wantSubs , & numFiles ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numFiles = = 0 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
gi . FS_FreeFileList ( list ) ;
2023-01-29 22:57:04 +01:00
return ;
}
2023-01-30 00:50:21 +01:00
ref - > setRefValue ( array ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( i = 0 ; i < numFiles ; i + + )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ScriptVariable * indexes = new ScriptVariable ;
ScriptVariable * values = new ScriptVariable ;
indexes - > setIntValue ( i ) ;
values - > setStringValue ( list [ i ] ) ;
ref - > setArrayAt ( * indexes , * values ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
gi . FS_FreeFileList ( list ) ;
ev - > AddValue ( * array ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileNewDirectory
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-02-01 00:28:40 +01:00
str path ;
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
int ret = 0 ;
2023-01-29 22:57:04 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for fnewdir! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
path = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( path = = NULL )
{
throw ScriptException ( " Path is NULL - fnewdir! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
# ifdef WIN32
ret = _mkdir ( path ) ;
# else
ret = mkdir ( path , 0777 ) ;
# endif
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( ret ) ;
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FileRemoveDirectory
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-02-01 00:28:40 +01:00
str path ;
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
int ret = 0 ;
2023-01-29 22:57:04 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for fremovedir! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
path = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( path = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Path is NULL - fremovedir! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
# ifdef WIN32
ret = _rmdir ( path ) ;
# else
ret = rmdir ( path ) ;
# endif
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( ret ) ;
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetArrayKeys
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Entity * ent = NULL ;
ScriptVariable array ;
ScriptVariable * value ;
int i = 0 ;
int arraysize ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
/* Retrieve the array */
array = ev - > GetValue ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
/* Cast the array */
array . CastConstArrayValue ( ) ;
arraysize = array . arraysize ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( arraysize < 1 ) {
2023-01-29 22:57:04 +01:00
return ;
}
2023-01-30 00:50:21 +01:00
ScriptVariable * ref = new ScriptVariable , * newArray = new ScriptVariable ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ref - > setRefValue ( newArray ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( int i = 1 ; i < = arraysize ; i + + )
{
value = array [ i ] ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
/* Get the array's name */
//str name = value->getName();
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . Printf ( " name = %s \n " , value - > GetTypeName ( ) ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ScriptVariable * newIndex = new ScriptVariable , * newValue = new ScriptVariable ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
newIndex - > setIntValue ( i ) ;
newValue - > setStringValue ( " NIL " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
//name.removeRef();
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ref - > setArrayAt ( * newIndex , * newValue ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ev - > AddValue ( * newArray ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetArrayValues
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
Entity * ent = NULL ;
ScriptVariable array ;
ScriptVariable * value ;
int i = 0 ;
int arraysize ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
/* Retrieve the array */
array = ev - > GetValue ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( array . GetType ( ) = = VARIABLE_NONE ) {
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
/* Cast the array */
array . CastConstArrayValue ( ) ;
arraysize = array . arraysize ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( arraysize < 1 ) {
return ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ScriptVariable * ref = new ScriptVariable , * newArray = new ScriptVariable ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ref - > setRefValue ( newArray ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( int i = 1 ; i < = arraysize ; i + + )
{
value = array [ i ] ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ScriptVariable * newIndex = new ScriptVariable ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
newIndex - > setIntValue ( i - 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ref - > setArrayAt ( * newIndex , * value ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ev - > AddValue ( * newArray ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetDate
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
char buff [ 1024 ] ;
time_t rawtime ;
struct tm * timeinfo ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
time ( & rawtime ) ;
timeinfo = localtime ( & rawtime ) ;
strftime ( buff , 64 , " %d.%m.%Y %r " , timeinfo ) ;
ev - > AddString ( buff ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetTimeZone
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int gmttime ;
int local ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
time_t rawtime ;
struct tm * timeinfo , * ptm ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
int timediff ;
int tmp ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
tmp = ev - > GetInteger ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
time ( & rawtime ) ;
timeinfo = localtime ( & rawtime ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
local = timeinfo - > tm_hour ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ptm = gmtime ( & rawtime ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gmttime = ptm - > tm_hour ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
timediff = local - gmttime ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( timediff ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
// IMPORTANT NOTE:
// SLRE is buggy, consider switch to Boost.Regex or .xpressive
void ScriptThread : : PregMatch
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
slre_cap sl_cap [ 32 ] ;
int i , j ;
size_t iMaxLength ;
size_t iLength ;
size_t iFoundLength = 0 ;
str pattern , subject ;
ScriptVariable index , value , subindex , subvalue ;
ScriptVariable array , subarray ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
memset ( sl_cap , 0 , sizeof ( sl_cap ) ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
pattern = ev - > GetString ( 1 ) ;
subject = ev - > GetString ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
iMaxLength = strlen ( subject ) ;
iLength = 0 ;
i = 0 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
while ( iLength < iMaxLength & &
( iFoundLength = slre_match ( pattern , subject . c_str ( ) + iLength , iMaxLength - iLength , sl_cap , sizeof ( sl_cap ) / sizeof ( sl_cap [ 0 ] ) , 0 ) ) > 0 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
subarray . Clear ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( j = 0 ; sl_cap [ j ] . ptr ! = NULL ; j + + )
{
char * buffer ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
buffer = ( char * ) gi . Malloc ( sl_cap [ j ] . len + 1 ) ;
buffer [ sl_cap [ j ] . len ] = 0 ;
strncpy ( buffer , sl_cap [ j ] . ptr , sl_cap [ j ] . len ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
subindex . setIntValue ( j ) ;
subvalue . setStringValue ( buffer ) ;
subarray . setArrayAtRef ( subindex , subvalue ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . Free ( buffer ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
iLength + = sl_cap [ j ] . ptr - subject . c_str ( ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
index . setIntValue ( i ) ;
array . setArrayAtRef ( index , subarray ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
i + + ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddValue ( array ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIsArray
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ScriptVariable * value = & ev - > GetValue ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( value = = NULL ) {
return ev - > AddInteger ( 0 ) ;
}
ev - > AddInteger ( value - > type = = VARIABLE_ARRAY | | value - > type = = VARIABLE_CONSTARRAY | | value - > type = = VARIABLE_SAFECONTAINER ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : EventIsDefined
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( ! ev - > IsNilAt ( 1 ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FlagClear
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
str name ;
Flag * flag ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
name = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
flag = flags . FindFlag ( name ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( flag = = NULL ) {
throw ScriptException ( " Invalid flag '%s' \n " , name . c_str ( ) ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
delete flag ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FlagInit
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
str name ;
Flag * flag ;
name = ev - > GetString ( 1 ) ;
flag = flags . FindFlag ( name ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( flag ! = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
flag - > Reset ( ) ;
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
flag = new Flag ;
flag - > bSignaled = false ;
strcpy ( flag - > flagName , name ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FlagSet
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
str name ;
Flag * flag ;
name = ev - > GetString ( 1 ) ;
flag = flags . FindFlag ( name ) ;
if ( flag = = NULL ) {
throw ScriptException ( " Invalid flag '%s'. \n " , name . c_str ( ) ) ;
}
flag - > Set ( ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : FlagWait
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
str name ;
Flag * flag ;
name = ev - > GetString ( 1 ) ;
flag = flags . FindFlag ( name ) ;
if ( flag = = NULL ) {
throw ScriptException ( " Invalid flag '%s'. \n " , name . c_str ( ) ) ;
}
flag - > Wait ( this ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathCos
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for cos! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ( double ) ev - > GetFloat ( 1 ) ;
res = cos ( x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathSin
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for sin! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = sin ( x ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathTan
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
{
throw ScriptException ( " Wrong arguments count for tan! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = tan ( x ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathACos
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for acos! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = acos ( x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathASin
(
Event * ev
)
{
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for asin! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = asin ( x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathATan
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
{
throw ScriptException ( " Wrong arguments count for atan! \n " ) ;
}
x = ev - > GetFloat ( 1 ) ;
res = atan ( x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathATan2
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , y = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 2 )
{
throw ScriptException ( " Wrong arguments count for atan2! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
y = ev - > GetFloat ( 1 ) ;
x = ev - > GetFloat ( 2 ) ;
res = atan2 ( y , x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathCosH
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for cosh! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = cosh ( x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathSinH
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
{
throw ScriptException ( " Wrong arguments count for sinh! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = sinh ( x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathTanH
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
{
throw ScriptException ( " Wrong arguments count for tanh! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = tanh ( x ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathExp
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for exp! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = exp ( x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathFrexp
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
int exp = 0 ;
ScriptVariable * ref = new ScriptVariable ;
ScriptVariable * array = new ScriptVariable ;
ScriptVariable * SignificandIndex = new ScriptVariable ;
ScriptVariable * ExponentIndex = new ScriptVariable ;
ScriptVariable * SignificandVal = new ScriptVariable ;
ScriptVariable * ExponentVal = new ScriptVariable ;
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for frexp! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = frexp ( x , & exp ) ;
ref - > setRefValue ( array ) ;
SignificandIndex - > setStringValue ( " significand " ) ;
ExponentIndex - > setStringValue ( " exponent " ) ;
SignificandVal - > setFloatValue ( ( float ) res ) ;
ExponentVal - > setIntValue ( exp ) ;
ref - > setArrayAt ( * SignificandIndex , * SignificandVal ) ;
ref - > setArrayAt ( * ExponentIndex , * ExponentVal ) ;
ev - > AddValue ( * array ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathLdexp
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
int exp = 0 ;
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 2 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for ldexp! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
exp = ev - > GetInteger ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
res = ldexp ( x , exp ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathLog
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
{
throw ScriptException ( " Wrong arguments count for log! \n " ) ;
}
x = ev - > GetFloat ( 1 ) ;
res = log ( x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathLog10
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for log10! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = log10 ( x ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathModf
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
double intpart = 0 ;
//char varIntpartIndex[16] = { 0 }, varFractionalIndex[16] = { 0 }, varIntpartVal[16] = { 0 }, varFractionalVal[16] = { 0 }, varArray[16] = { 0 }, varRef[16] = { 0 };
ScriptVariable * array = new ScriptVariable ;
ScriptVariable * ref = new ScriptVariable ;
ScriptVariable * IntpartIndex = new ScriptVariable ;
ScriptVariable * FractionalIndex = new ScriptVariable ;
ScriptVariable * FractionalVal = new ScriptVariable ;
ScriptVariable * IntpartVal = new ScriptVariable ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for modf! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = modf ( x , & intpart ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ref - > setRefValue ( array ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
IntpartIndex - > setStringValue ( " intpart " ) ;
FractionalIndex - > setStringValue ( " fractional " ) ;
FractionalVal - > setFloatValue ( ( float ) res ) ;
IntpartVal - > setFloatValue ( ( float ) intpart ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ref - > setArrayAt ( * IntpartIndex , * IntpartVal ) ;
ref - > setArrayAt ( * FractionalIndex , * FractionalVal ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddValue ( * array ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathPow
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double base = 0.0f , res = 0.0f ;
int exponent = 0 ;
numArgs = ev - > NumArgs ( ) ;
if ( numArgs ! = 2 )
{
throw ScriptException ( " Wrong arguments count for pow! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
base = ev - > GetFloat ( 1 ) ;
exponent = ev - > GetInteger ( 2 ) ;
res = pow ( base , exponent ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathSqrt
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
{
throw ScriptException ( " Wrong arguments count for sqrt! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = sqrt ( x ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathCeil
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for ceil! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = ceil ( x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathFloor
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double x = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for floor! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
x = ev - > GetFloat ( 1 ) ;
res = floor ( x ) ;
ev - > AddFloat ( ( float ) res ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : MathFmod
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
double numerator = 0.0f , denominator = 0.0f , res = 0.0f ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 2 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for fmod! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
numerator = ev - > GetFloat ( 1 ) ;
denominator = ev - > GetFloat ( 2 ) ;
res = fmod ( numerator , denominator ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddFloat ( ( float ) res ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
int checkMD5 ( const char * filepath , char * md5Hash )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
md5_state_t state ;
md5_byte_t digest [ 16 ] ;
int di ;
FILE * f = NULL ;
char * buff = NULL ;
size_t filesize = 0 ;
size_t bytesread = 0 ;
f = fopen ( filepath , " rb " ) ;
if ( f = = NULL )
return - 1 ;
fseek ( f , 0 , SEEK_END ) ;
filesize = ftell ( f ) ;
rewind ( f ) ;
//gi.Printf("Size: %i\n", filesize);
buff = ( char * ) gi . Malloc ( filesize + 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( buff = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
fclose ( f ) ;
Com_Printf ( " error0 \n " ) ;
return - 2 ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
buff [ filesize ] = ' \0 ' ;
bytesread = fread ( buff , 1 , filesize , f ) ;
if ( bytesread < filesize )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
gi . Free ( buff ) ;
fclose ( f ) ;
2023-02-01 00:28:40 +01:00
Com_Printf ( " error1: %zi \n " , bytesread ) ;
2023-01-30 00:50:21 +01:00
return - 3 ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
fclose ( f ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
md5_init ( & state ) ;
md5_append ( & state , ( const md5_byte_t * ) buff , filesize ) ;
md5_finish ( & state , digest ) ;
for ( di = 0 ; di < 16 ; + + di )
sprintf ( md5Hash + di * 2 , " %02x " , digest [ di ] ) ;
gi . Free ( buff ) ;
return 0 ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
int checkMD5String ( const char * string , char * md5Hash )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
md5_state_t state ;
md5_byte_t digest [ 16 ] ;
int di ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
char * buff = NULL ;
size_t stringlen = 0 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
stringlen = strlen ( string ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
buff = ( char * ) gi . Malloc ( stringlen + 1 ) ;
if ( buff = = NULL )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
return - 1 ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
buff [ stringlen ] = ' \0 ' ;
memcpy ( buff , string , stringlen ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
md5_init ( & state ) ;
md5_append ( & state , ( const md5_byte_t * ) buff , stringlen ) ;
md5_finish ( & state , digest ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
for ( di = 0 ; di < 16 ; + + di )
sprintf ( md5Hash + di * 2 , " %02x " , digest [ di ] ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gi . Free ( buff ) ;
return 0 ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Md5File
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
char hash [ 64 ] ;
2023-02-01 00:28:40 +01:00
str filename ;
2023-01-30 00:50:21 +01:00
int ret = 0 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for md5file! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
filename = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ret = checkMD5 ( filename , hash ) ;
if ( ret ! = 0 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( - 1 ) ;
throw ScriptException ( " Error while generating MD5 checksum for file - md5file! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ev - > AddString ( hash ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
void ScriptThread : : StringBytesCopy
(
Event * ev
)
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
{
int bytes = ev - > GetInteger ( 1 ) ;
str source = ev - > GetString ( 2 ) ;
char * buffer ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
buffer = ( char * ) gi . Malloc ( bytes + 1 ) ;
strncpy ( buffer , source , bytes ) ;
buffer [ bytes ] = 0 ;
ev - > AddString ( buffer ) ;
gi . Free ( buffer ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : Md5String
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
char hash [ 64 ] ;
2023-02-01 00:28:40 +01:00
str text ;
2023-01-30 00:50:21 +01:00
int ret = 0 ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for md5string! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
text = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ret = checkMD5String ( text , hash ) ;
if ( ret ! = 0 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( - 1 ) ;
throw ScriptException ( " Error while generating MD5 checksum for strin! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ev - > AddString ( hash ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
scriptedEvType_t EventNameToType ( const char * eventname , char * fullname )
{
scriptedEvType_t evType ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
const char * eventname_full ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( strcmp ( eventname , " connected " ) = = 0 ) {
eventname_full = " ConnectedEvent " ;
evType = SE_CONNECTED ;
}
else if ( strcmp ( eventname , " disconnected " ) = = 0 ) {
eventname_full = " DisconnectedEvent " ;
evType = SE_DISCONNECTED ;
}
else if ( strcmp ( eventname , " spawn " ) = = 0 ) {
eventname_full = " SpawnEvent " ;
evType = SE_SPAWN ;
}
else if ( strcmp ( eventname , " damage " ) = = 0 ) {
eventname_full = " DamageEvent " ;
evType = SE_DAMAGE ;
}
else if ( strcmp ( eventname , " kill " ) = = 0 ) {
eventname_full = " KillEvent " ;
evType = SE_KILL ;
}
else if ( strcmp ( eventname , " keypress " ) = = 0 ) {
eventname_full = " KeypressEvent " ;
evType = SE_KEYPRESS ;
}
else if ( strcmp ( eventname , " intermission " ) = = 0 ) {
eventname_full = " IntermissionEvent " ;
evType = SE_INTERMISSION ;
}
else if ( strcmp ( eventname , " servercommand " ) = = 0 ) {
eventname_full = " ServerCommandEvent " ;
evType = SE_SERVERCOMMAND ;
}
else if ( strcmp ( eventname , " changeteam " ) = = 0 ) {
eventname_full = " ChangeTeamEvent " ;
evType = SE_CHANGETEAM ;
}
else
return SE_DEFAULT ;
if ( fullname ! = NULL ) {
strcpy ( fullname , eventname_full ) ;
}
return evType ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : RegisterEvent
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
str eventname ;
char eventname_full [ 64 ] ;
scriptedEvType_t evType ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
eventname = ev - > GetString ( 1 ) ;
evType = EventNameToType ( eventname , eventname_full ) ;
if ( evType = = SE_DEFAULT )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( 0 ) ;
throw ScriptException ( " Wrong event type name for registerev! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( scriptedEvents [ evType ] . IsRegistered ( ) )
{
ev - > AddInteger ( 1 ) ;
throw ScriptException ( " Scripted event '%s' is already registered \n " , eventname . c_str ( ) ) ;
}
scriptedEvents [ evType ] . label . SetThread ( ev - > GetValue ( 2 ) ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( evType = = SE_KEYPRESS ) {
gi . Cvar_Set ( " sv_keypressevents " , " 1 " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
else if ( evType = = SE_SERVERCOMMAND ) {
gi . Cvar_Set ( " sv_servercmdevents " , " 1 " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( 0 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : UnregisterEvent
2023-01-29 22:57:04 +01:00
(
2023-01-30 00:50:21 +01:00
Event * ev
2023-01-29 22:57:04 +01:00
)
{
2023-02-01 00:28:40 +01:00
str eventname ;
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
scriptedEvType_t evType ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
eventname = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
evType = EventNameToType ( eventname , NULL ) ;
2023-01-29 22:57:04 +01:00
2023-02-01 19:29:13 +01:00
if ( evType = = scriptedEvType_t ( ~ 0u ) )
2023-01-30 00:50:21 +01:00
{
ev - > AddInteger ( 0 ) ;
throw ScriptException ( " Wrong event type name for unregisterev! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs ! = 1 )
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
throw ScriptException ( " Wrong arguments count for unregisterev! \n " ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
eventname = ev - > GetString ( 1 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ! scriptedEvents [ evType ] . IsRegistered ( ) )
{
ev - > AddInteger ( 1 ) ;
return ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
scriptedEvents [ evType ] . label . Set ( " " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( evType = = SE_KEYPRESS )
gi . Cvar_Set ( " sv_keypressevents " , " 0 " ) ;
else if ( evType = = SE_SERVERCOMMAND )
gi . Cvar_Set ( " sv_servercmdevents " , " 0 " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddInteger ( 0 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : TypeOfVariable
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
char * type = NULL ;
ScriptVariable * variable ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
if ( numArgs ! = 1 )
{
throw ScriptException ( " Wrong arguments count for typeof! \n " ) ;
}
variable = ( ScriptVariable * ) & ev - > GetValue ( 1 ) ;
type = ( char * ) variable - > GetTypeName ( ) ;
ev - > AddString ( type ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : VisionGetNaked
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
ev - > AddString ( vision_current ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : VisionSetNaked
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
str vision = ev - > GetString ( 1 ) ;
float fade_time ;
cvar_t * mapname = gi . Cvar_Get ( " mapname " , " " , 0 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( ev - > NumArgs ( ) > 1 ) {
fade_time = ev - > GetFloat ( 2 ) ;
}
else {
fade_time = 0.0f ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
if ( ! vision . length ( ) ) {
vision = mapname - > string ;
}
// We won't malicously overflow client commands :)
if ( vision . length ( ) > = MAX_STRING_TOKENS ) {
throw ScriptException ( " vision_name exceeds the maximum vision name limit (256) ! \ n " ) ;
}
vision_current = vision ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
# ifdef GAME_DLL
gi . SendServerCommand ( - 1 , " vsn %s %f " , vision . c_str ( ) , fade_time ) ;
# elif defined CGAME_DLL
// TODO
# endif
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : GetTime
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int timearray [ 3 ] , gmttime ;
char buff [ 1024 ] ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
time_t rawtime ;
struct tm * timeinfo , * ptm ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
int timediff ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
time ( & rawtime ) ;
timeinfo = localtime ( & rawtime ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
timearray [ 0 ] = timeinfo - > tm_hour ;
timearray [ 1 ] = timeinfo - > tm_min ;
timearray [ 2 ] = timeinfo - > tm_sec ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ptm = gmtime ( & rawtime ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
gmttime = ptm - > tm_hour ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
timediff = timearray [ 0 ] - gmttime ;
sprintf ( buff , " %02i:%02i:%02i " , ( int ) timearray [ 0 ] , ( int ) timearray [ 1 ] , ( int ) timearray [ 2 ] ) ;
ev - > AddString ( buff ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
void ScriptThread : : TraceDetails
(
Event * ev
)
2023-01-29 22:57:04 +01:00
{
2023-01-30 00:50:21 +01:00
int numArgs = 0 ;
int pass_entity = 0 ;
int mask = 0x2000B01 ;
trace_t trace ;
Vector vecStart , vecEnd , vecMins , vecMaxs ;
Entity * entity ;
//todo : remove all these vars and add one for index and one for value
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ScriptVariable array ;
ScriptVariable allSolidIndex , allSolidValue ;
ScriptVariable startSolidIndex , startSolidValue ;
ScriptVariable fractionIndex , fractionValue ;
ScriptVariable endPosIndex , endPosValue ;
ScriptVariable surfaceFlagsIndex , surfaceFlagsValue ;
ScriptVariable shaderNumIndex , shaderNumValue ;
ScriptVariable contentsIndex , contentsValue ;
ScriptVariable entityNumIndex , entityNumValue ;
ScriptVariable locationIndex , locationValue ;
ScriptVariable entityIndex , entityValue ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
numArgs = ev - > NumArgs ( ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs < 2 | | numArgs > 6 )
{
throw ScriptException ( " Wrong arguments count for traced! \n " ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
vecStart = ev - > GetVector ( 1 ) ;
vecEnd = ev - > GetVector ( 2 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs > = 3 ) {
pass_entity = ev - > GetInteger ( 3 ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs > = 4 ) {
vecMins = ev - > GetVector ( 4 ) ;
}
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
if ( numArgs > = 5 ) {
vecMaxs = ev - > GetVector ( 5 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
if ( numArgs = = 6 ) {
mask = ev - > GetInteger ( 6 ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
gi . Trace ( & trace , vecStart , vecMins , vecMaxs , vecEnd , pass_entity , mask , 0 , 0 ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
allSolidIndex . setStringValue ( " allSolid " ) ;
startSolidIndex . setStringValue ( " startSolid " ) ;
fractionIndex . setStringValue ( " fraction " ) ;
endPosIndex . setStringValue ( " endpos " ) ;
surfaceFlagsIndex . setStringValue ( " surfaceFlags " ) ;
shaderNumIndex . setStringValue ( " shaderNum " ) ;
contentsIndex . setStringValue ( " contents " ) ;
entityNumIndex . setStringValue ( " entityNum " ) ;
locationIndex . setStringValue ( " location " ) ;
entityIndex . setStringValue ( " entity " ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
allSolidValue . setIntValue ( trace . allsolid ) ;
startSolidValue . setIntValue ( trace . startsolid ) ;
fractionValue . setFloatValue ( trace . fraction ) ;
endPosValue . setVectorValue ( trace . endpos ) ;
surfaceFlagsValue . setIntValue ( trace . surfaceFlags ) ;
shaderNumValue . setIntValue ( trace . shaderNum ) ;
contentsValue . setIntValue ( trace . contents ) ;
entityNumValue . setIntValue ( trace . entityNum ) ;
locationValue . setIntValue ( trace . location ) ;
entity = G_GetEntity ( trace . entityNum ) ;
// Have to use G_GetEntity instead otherwise it won't work
if ( entity ! = NULL ) {
entityValue . setListenerValue ( entity ) ;
2023-01-29 22:57:04 +01:00
}
2023-01-30 00:50:21 +01:00
array . setArrayAtRef ( allSolidIndex , allSolidValue ) ;
array . setArrayAtRef ( startSolidIndex , startSolidValue ) ;
array . setArrayAtRef ( fractionIndex , fractionValue ) ;
array . setArrayAtRef ( endPosIndex , endPosValue ) ;
array . setArrayAtRef ( surfaceFlagsIndex , surfaceFlagsValue ) ;
array . setArrayAtRef ( shaderNumIndex , shaderNumValue ) ;
array . setArrayAtRef ( contentsIndex , contentsValue ) ;
array . setArrayAtRef ( entityNumIndex , entityNumValue ) ;
array . setArrayAtRef ( locationIndex , locationValue ) ;
array . setArrayAtRef ( entityIndex , entityValue ) ;
2023-01-29 22:57:04 +01:00
2023-01-30 00:50:21 +01:00
ev - > AddValue ( array ) ;
}