示例#1
0
void DispatchThink( edict_t *pent )
{
	CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent);
	if (pEntity)
	{
		if ( FBitSet( pEntity->pev->flags, FL_DORMANT ) )
			ALERT( at_error, "Dormant entity %s is thinking!!\n", STRING(pEntity->pev->classname) );

		//LLAPb begin
		if (!pEntity->scripted || !ScriptsActive())
		{
			pEntity->Think();

			return;
		}

		GenericFunction *pfn = pEntity->my_script->funcs->GetFn(M_THINK);

		if (!pfn)
		{
			pEntity->Think();

			return;
		}

		if (NoErrors())
		{
			pfn->PreExecute();

			int i = ENTINDEX(pent);
			double f = gpGlobals->frametime;

			if (pfn->argc > 0)
				pfn->PassArg(0, Type(&i, _INT));

			if (pfn->argc > 1)
				pfn->PassArg(1, Type(&f, DOUBLE));

			switch (pfn->specification)
			{
			case SPECIFICATION_BEFORE:
				pfn->Execute();
				pEntity->Think();
				break;

			case SPECIFICATION_INSTEAD:
				pfn->Execute();
				break;

			default:
				pEntity->Think();
				pfn->Execute();
				break;
			}
		}
		else
			//LLAPb end
			pEntity->Think();
	}
}
示例#2
0
void CBaseEntity::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) 
{
		if (!scripted || !ScriptsActive())
		{
			RealUse( pActivator, pCaller, useType, value );

			return;
		}

		GenericFunction *pfn = my_script->funcs->GetFn(M_USE);

		if (!pfn)
		{
			RealUse( pActivator, pCaller, useType, value );

			return;
		}

		if (NoErrors())
		{
			pfn->PreExecute();

			int i = ENTINDEX(edict()), j = ENTINDEX(pCaller->edict()),
				t = (int)useType;

			double v = value;

			if (pfn->argc > 0)
				pfn->PassArg(0, Type(&i, _INT));

			if (pfn->argc > 1)
				pfn->PassArg(1, Type(&j, _INT));

			if (pfn->argc > 2)
				pfn->PassArg(2, Type(&t, _INT));

			if (pfn->argc > 3)
				pfn->PassArg(3, Type(&v, DOUBLE));

			switch (pfn->specification)
			{
			case SPECIFICATION_BEFORE:
				pfn->Execute();
				RealUse( pActivator, pCaller, useType, value );
				break;

			case SPECIFICATION_INSTEAD:
				pfn->Execute();
				break;

			default:
				RealUse( pActivator, pCaller, useType, value );
				pfn->Execute();
				break;
			}
		}
		else
			RealUse( pActivator, pCaller, useType, value );
}
示例#3
0
void CBaseEntity::ReSpawn( void )
{
	if (scripted && ScriptsActive())
	{
		GenericFunction *pfn = my_script->funcs->GetFn(M_SPAWN);

		if (!pfn)
		{
			RealReSpawn();

			return;
		}

		if (NoErrors())
		{
			pfn->PreExecute();

			int i = ENTINDEX(edict());

			if (pfn->argc > 0)
				pfn->PassArg(0, Type(&i, _INT));

			switch (pfn->specification)
			{
			case SPECIFICATION_BEFORE:
				pfn->Execute();
				RealReSpawn();
				break;

			case SPECIFICATION_INSTEAD:
				pfn->Execute();
				break;

			default:
				RealReSpawn();
				pfn->Execute();
				break;
			}
		}
		else
			RealReSpawn();
	}
	else
		RealReSpawn();
}
示例#4
0
int CBaseEntity :: TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType )
{
		if (!scripted || !ScriptsActive())
		{
			return RealTakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
		}

		GenericFunction *pfn = my_script->funcs->GetFn(M_DAMAGED);

		if (!pfn)
		{
			return RealTakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
		}

		if (NoErrors())
		{
			pfn->PreExecute();

			int i = ENTINDEX(edict()), j = ENTINDEX(ENT(pevAttacker));

			double v = flDamage;

			TraceResult tr;

			if (pevInflictor == pevAttacker && pevAttacker)//yep... bad way
			{
				CBaseEntity *pEnt = CBaseEntity::Instance(pevAttacker);

				if (pEnt->IsPlayer())
				{
					CBasePlayer *pPlayer = (CBasePlayer*)pEnt;

					if (pPlayer)
					{
						UTIL_MakeVectors(pPlayer->pev->v_angle);
						Vector vec_dir = gpGlobals->v_forward * 32000;

						UTIL_TraceLine(pPlayer->GetGunPosition(), pevInflictor->origin + vec_dir, dont_ignore_monsters, ENT(pevInflictor), &tr);
					}
					else
						UTIL_TraceLine(pevInflictor->origin, pev->origin, dont_ignore_monsters, ENT(pevInflictor), &tr);
				}
				else
					UTIL_TraceLine(pevInflictor->origin, pev->origin, dont_ignore_monsters, ENT(pevInflictor), &tr);
			}
			else
				UTIL_TraceLine(pevInflictor->origin, pev->origin, dont_ignore_monsters, ENT(pevInflictor), &tr);

			double x = tr.vecEndPos.x;
			double y = tr.vecEndPos.y;
			double z = tr.vecEndPos.z;

			Type arg3[3] = {Type(&x, DOUBLE), Type(&y, DOUBLE), Type(&z, DOUBLE)};

			if (pfn->argc > 0)
				pfn->PassArg(0, Type(&i, _INT));

			if (pfn->argc > 1)
				pfn->PassArg(1, Type(&j, _INT));

			if (pfn->argc > 2)
				pfn->PassArg(2, Type(&v, DOUBLE));

			if (pfn->argc > 3)
				pfn->PassArg(3, Type(&arg3[0], VECTOR_T, 3));

			if (pfn->argc > 4)
				pfn->PassArg(4, Type(&bitsDamageType, _INT));

			if (pfn->argc > 5)
				pfn->PassArg(5, Type(&tr.iHitgroup, _INT));

			switch (pfn->specification)
			{
			case SPECIFICATION_BEFORE:
				{
					Type res = pfn->Execute();

					if (res.my_type == DOUBLE)
						return RealTakeDamage( pevInflictor, pevAttacker, res.doublev, bitsDamageType );
					else if (res.my_type == _INT)
						return RealTakeDamage( pevInflictor, pevAttacker, res.intv, bitsDamageType );

					return RealTakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
				}

			case SPECIFICATION_INSTEAD:
				pfn->Execute();
				return 1;

			default:
				{
					int v = RealTakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
					pfn->Execute();
					return v;
				}
			}
		}
		else
			return RealTakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
}
示例#5
0
//LLAPb: this function is bullshit!!! Must of all calls of "Use" are coming not from engine. F**k!!!
void DispatchUse( edict_t *pentUsed, edict_t *pentOther )
{
	CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pentUsed);
	CBaseEntity *pOther = (CBaseEntity *)GET_PRIVATE(pentOther);

	//LLAPb begin
	if (pEntity && !(pEntity->pev->flags & FL_KILLME) )
	{
		if (!pEntity->scripted || !ScriptsActive())
		{
			pEntity->Use( pOther, pOther, USE_TOGGLE, 0 );

			return;
		}

		GenericFunction *pfn = pEntity->my_script->funcs->GetFn(M_USE);

		if (!pfn)
		{
			pEntity->Use( pOther, pOther, USE_TOGGLE, 0 );

			return;
		}

		if (NoErrors())
		{
			pfn->PreExecute();

			int i = ENTINDEX(pentUsed), j = ENTINDEX(pentOther), t = (int)USE_TOGGLE;
			double v = 0;

			if (pfn->argc > 0)
				pfn->PassArg(0, Type(&i, _INT));

			if (pfn->argc > 1)
				pfn->PassArg(1, Type(&j, _INT));

			if (pfn->argc > 2)
				pfn->PassArg(2, Type(&t, _INT));

			if (pfn->argc > 3)
				pfn->PassArg(3, Type(&v, DOUBLE));

			switch (pfn->specification)
			{
			case SPECIFICATION_BEFORE:
				pfn->Execute();
				pEntity->Use( pOther, pOther, USE_TOGGLE, 0 );
				break;

			case SPECIFICATION_INSTEAD:
				pfn->Execute();
				break;

			default:
				pEntity->Use( pOther, pOther, USE_TOGGLE, 0 );
				pfn->Execute();
				break;
			}
		}
		else
			pEntity->Use( pOther, pOther, USE_TOGGLE, 0 );
	}
	//LLAPb end
}
示例#6
0
void DispatchTouch( edict_t *pentTouched, edict_t *pentOther )
{
	if ( gTouchDisabled )
		return;

	CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pentTouched);
	CBaseEntity *pOther = (CBaseEntity *)GET_PRIVATE( pentOther );

	//LLAPb changes begin
	if ( pEntity && pOther && ! ((pEntity->pev->flags | pOther->pev->flags) & FL_KILLME) )
	{
		if (!pEntity->scripted || !ScriptsActive())
		{
			pEntity->Touch( pOther );

			return;
		}

		GenericFunction *pfn = pEntity->my_script->funcs->GetFn(M_TOUCH);

		if (!pfn)
		{
			pEntity->Touch( pOther );

			return;
		}

		if (NoErrors())
		{
			pfn->PreExecute();

			int i = ENTINDEX(pentTouched), j = ENTINDEX(pentOther);

			if (pfn->argc > 0)
				pfn->PassArg(0, Type(&i, _INT));

			if (pfn->argc > 1)
				pfn->PassArg(1, Type(&j, _INT));

			switch (pfn->specification)
			{
			case SPECIFICATION_BEFORE:
				pfn->Execute();
				pEntity->Touch( pOther );
				break;

			case SPECIFICATION_INSTEAD:
				pfn->Execute();
				break;

			default:
				pEntity->Touch( pOther );
				pfn->Execute();
				break;
			}
		}
		else
			pEntity->Touch( pOther );
	}
	//LLAPb changes end
}
示例#7
0
//LLAPb: I do not trust this callback, there's a  lots of directly calls of "Spawn" in code. Must be reason...
int DispatchSpawn( edict_t *pent )
{
	CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent);

	if (pEntity)
	{
		// Initialize these or entities who don't link to the world won't have anything in here
		pEntity->pev->absmin = pEntity->pev->origin - Vector(1,1,1);
		pEntity->pev->absmax = pEntity->pev->origin + Vector(1,1,1);


		//LLAPb begin
		if (!FStringNull(pEntity->script_file))
		{
			pEntity->PRECACHE_SCRIPT((char*)STRING(pEntity->script_file));
		}

		if (pEntity->scripted && ScriptsActive())
		{
			GenericFunction *pfn = pEntity->my_script->funcs->GetFn(M_SPAWN);

			if (!pfn)
			{
				pEntity->Spawn();

				goto LLAPb_end;
			}

			if (NoErrors())
			{
				pfn->PreExecute();

				int i = ENTINDEX(pent);

				if (pfn->argc > 0)
					pfn->PassArg(0, Type(&i, _INT));

				switch (pfn->specification)
				{
				case SPECIFICATION_BEFORE:
					pfn->Execute();
					pEntity->Spawn();
					break;

				case SPECIFICATION_INSTEAD:
					pfn->Execute();
					break;

				default:
					pEntity->Spawn();
					pfn->Execute();
					break;
				}
			}
			else
				pEntity->Spawn();
		}
		else
			pEntity->Spawn();

		LLAPb_end:
		//LLAPb end


		// Try to get the pointer again, in case the spawn function deleted the entity.
		// UNDONE: Spawn() should really return a code to ask that the entity be deleted, but
		// that would touch too much code for me to do that right now.
		pEntity = (CBaseEntity *)GET_PRIVATE(pent);

		if ( pEntity )
		{
			pEntity->pev->colormap = ENTINDEX(pent);

			if ( g_pGameRules && !g_pGameRules->IsAllowedToSpawn( pEntity ) )
				return -1;	// return that this entity should be deleted
			if ( pEntity->pev->flags & FL_KILLME )
				return -1;
		}
		// Handle global stuff here
		if ( pEntity && pEntity->pev->globalname ) 
		{
			const globalentity_t *pGlobal = gGlobalState.EntityFromTable( pEntity->pev->globalname );
			if ( pGlobal )
			{
				// Already dead? delete
				if ( pGlobal->state == GLOBAL_DEAD )
					return -1;
				else if ( !FStrEq( STRING(gpGlobals->mapname), pGlobal->levelName ) )
					pEntity->MakeDormant();	// Hasn't been moved to this level yet, wait but stay alive
				// In this level & not dead, continue on as normal
			}
			else
			{
				// Spawned entities default to 'On'
				gGlobalState.EntityAdd( pEntity->pev->globalname, gpGlobals->mapname, GLOBAL_ON );
//				ALERT( at_console, "Added global entity %s (%s)\n", STRING(pEntity->pev->classname), STRING(pEntity->pev->globalname) );
			}
		}

	}

	return 0;
}