#include "progsvm.h"
#include "clprogdefs.h"
#include "csprogs.h"
+#include "cl_collision.h"
//============================================================================
// Client prog handling
Host_Error(va("CL_VM_Error: %s", errorstring));
}
-model_t *CSQC_GetModelByIndex(int modelindex)
-{
- if(!modelindex)
- return NULL;
- if (modelindex < 0)
- {
- modelindex = -(modelindex+1);
- if (modelindex < MAX_MODELS)
- return cl.csqc_model_precache[modelindex];
- }
- else
- {
- if(modelindex < MAX_MODELS)
- return cl.model_precache[modelindex];
- }
- return NULL;
-}
-
-model_t *CSQC_GetModelFromEntity(prvm_edict_t *ed)
-{
- if (!ed || ed->priv.server->free)
- return NULL;
- return CSQC_GetModelByIndex((int)ed->fields.client->modelindex);
-}
-
//[515]: set globals before calling R_UpdateView, WEIRD CRAP
static void CSQC_SetGlobals (void)
{
prog->globals.client->time = cl.time;
prog->globals.client->frametime = cl.time - csqc_frametime;
csqc_frametime = cl.time;
- prog->globals.client->servercommandframe = cl.servermovesequence;
- prog->globals.client->clientcommandframe = cl.movesequence;
+ prog->globals.client->servercommandframe = cls.servermovesequence;
+ prog->globals.client->clientcommandframe = cls.movesequence;
VectorCopy(cl.viewangles, prog->globals.client->input_angles);
VectorCopy(cl.viewangles, csqc_angles);
prog->globals.client->input_buttons = cl.cmd.buttons;
model_t *model;
matrix4x4_t tagmatrix, matrix2;
- model = CSQC_GetModelFromEntity(ed);
+ model = CL_GetModelFromEdict(ed);
if (!model)
return false;
e->render.skinnum = (int)ed->fields.client->skin;
e->render.effects |= e->render.model->flags2 & (EF_FULLBRIGHT | EF_ADDITIVE);
scale = 1;
- // FIXME: renderflags should be in the cl_entvars_t
-#if 1
renderflags = 0;
- if((val = PRVM_GETEDICTFIELDVALUE(ed, prog->fieldoffsets.renderflags)) && val->_float) renderflags = (int)val->_float;
-#else
- renderflags = (int)ed->fields.client->renderflags;
-#endif
-
- if((val = PRVM_GETEDICTFIELDVALUE(ed, prog->fieldoffsets.alpha)) && val->_float) e->render.alpha = val->_float;
- if((val = PRVM_GETEDICTFIELDVALUE(ed, prog->fieldoffsets.scale)) && val->_float) e->render.scale = scale = val->_float;
- if((val = PRVM_GETEDICTFIELDVALUE(ed, prog->fieldoffsets.colormod)) && VectorLength2(val->vector)) VectorCopy(val->vector, e->render.colormod);
- if((val = PRVM_GETEDICTFIELDVALUE(ed, prog->fieldoffsets.effects)) && val->_float) e->render.effects = (int)val->_float;
- if((val = PRVM_GETEDICTFIELDVALUE(ed, prog->fieldoffsets.tag_entity)) && val->edict)
+ if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.renderflags)) && val->_float) renderflags = (int)val->_float;
+ if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.alpha)) && val->_float) e->render.alpha = val->_float;
+ if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.scale)) && val->_float) e->render.scale = scale = val->_float;
+ if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.colormod)) && VectorLength2(val->vector)) VectorCopy(val->vector, e->render.colormod);
+ if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.effects)) && val->_float) e->render.effects = (int)val->_float;
+ if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.tag_entity)) && val->edict)
{
int tagentity;
int tagindex = 0;
tagentity = val->edict;
- if((val = PRVM_GETEDICTFIELDVALUE(ed, prog->fieldoffsets.tag_index)) && val->_float)
+ if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.tag_index)) && val->_float)
tagindex = (int)val->_float;
// FIXME: calculate tag matrix
Matrix4x4_CreateIdentity(&tagmatrix);
vec3_t left;
VectorNegate(prog->globals.client->v_right, left);
Matrix4x4_FromVectors(&matrix2, prog->globals.client->v_forward, left, prog->globals.client->v_up, ed->fields.client->origin);
+ Matrix4x4_Scale(&matrix2, scale, 1);
}
else
{
CL_UpdateRenderEntity(&e->render);
i = 0;
- if((val = PRVM_GETEDICTFIELDVALUE(ed, prog->fieldoffsets.renderflags)) && val->_float)
+ if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.renderflags)) && val->_float)
{
i = (int)val->_float;
if(i & RF_VIEWMODEL) e->render.flags |= RENDER_VIEWMODEL;
if(i & RF_ADDITIVE) e->render.effects |= EF_ADDITIVE;
}
- // transparent stuff can't be lit during the opaque stage
- if (e->render.effects & (EF_ADDITIVE | EF_NODEPTHTEST) || e->render.alpha < 1)
- e->render.flags |= RENDER_TRANSPARENT;
- // double sided rendering mode causes backfaces to be visible
- // (mostly useful on transparent stuff)
- if (e->render.effects & EF_DOUBLESIDED)
- e->render.flags |= RENDER_NOCULLFACE;
// either fullbright or lit
if (!(e->render.effects & EF_FULLBRIGHT) && !r_fullbright.integer)
e->render.flags |= RENDER_LIGHT;
// hide player shadow during intermission or nehahra movie
- if (!(e->render.effects & EF_NOSHADOW)
- && !(e->render.flags & (RENDER_VIEWMODEL | RENDER_TRANSPARENT))
+ if (!(e->render.effects & (EF_NOSHADOW | EF_ADDITIVE | EF_NODEPTHTEST))
+ && (e->render.alpha >= 1)
+ && !(e->render.flags & RENDER_VIEWMODEL)
&& (!(e->render.flags & RENDER_EXTERIORMODEL) || (!cl.intermission && cls.protocol != PROTOCOL_NEHAHRAMOVIE && !cl_noplayershadow.integer)))
e->render.flags |= RENDER_SHADOW;
float CL_VM_Event (float event) //[515]: needed ? I'd say "YES", but don't know for what :D
{
- float r;
+ float r = 0;
if(!csqc_loaded)
return 0;
CSQC_BEGIN
CSQC_END
}
-void CL_LinkEdict(prvm_edict_t *ent)
-{
- if (ent == prog->edicts)
- return; // don't add the world
-
- if (ent->priv.server->free)
- return;
-
- VectorAdd(ent->fields.client->origin, ent->fields.client->mins, ent->fields.client->absmin);
- VectorAdd(ent->fields.client->origin, ent->fields.client->maxs, ent->fields.client->absmax);
-
- World_LinkEdict(&cl.world, ent, ent->fields.client->absmin, ent->fields.client->absmax);
-}
-
void CL_VM_CB_BeginIncreaseEdicts(void)
{
int i;
prog->limit_edicts = CL_MAX_EDICTS;
prog->reserved_edicts = 0;
prog->edictprivate_size = sizeof(edict_engineprivate_t);
- prog->extensionstring = vm_cl_extensions;
+ prog->extensionstring = vm_sv_extensions;
prog->builtins = vm_cl_builtins;
prog->numbuiltins = vm_cl_numbuiltins;
prog->begin_increase_edicts = CL_VM_CB_BeginIncreaseEdicts;
PRVM_LoadProgs(csqc_progname.string, cl_numrequiredfunc, cl_required_func, 0, NULL, 0, NULL);
- if(prog->loaded)
- Con_Printf("CSQC ^5loaded (crc=%i, size=%i)\n", csprogsdatacrc, (int)csprogsdatasize);
- else
+ if (!prog->loaded)
{
CL_VM_Error("CSQC ^2failed to load\n");
if(!sv.active)
return;
}
+ Con_Printf("CSQC ^5loaded (crc=%i, size=%i)\n", csprogsdatacrc, (int)csprogsdatasize);
+
+ // check if OP_STATE animation is possible in this dat file
+ if (prog->fieldoffsets.nextthink >= 0 && prog->fieldoffsets.frame >= 0 && prog->fieldoffsets.think >= 0 && prog->globaloffsets.self >= 0)
+ prog->flag |= PRVM_OP_STATE;
+
//[515]: optional fields & funcs
if(prog->funcoffsets.CSQC_Parse_Print)
{