//=========================================================
// Crea un Jefe.
//=========================================================
CAI_BaseNPC *CDirectorSpawn::MakeBoss()
{
	// Desactivado
	if ( Disabled )
		return NULL;

	// Seleccionamos una clase de NPC para crear.
	const char *pClass	= SelectRandomBoss();
	CAI_BaseNPC *pNPC	= VerifyClass(pClass);

	// Ocurrio algún problema.
	if ( !pNPC )
	{
		Warning("[DIRECTOR SPAWN] Ha ocurrido un problema al intentar crear un Jefe. \r\n");
		return NULL;
	}

	Vector origin;

	// Verificamos si podemos crear el Grunt en el radio.
	if ( !CanMakeNPC(pNPC, &origin) )
		return NULL;

	// Lugar de creación.
	pNPC->SetAbsOrigin(origin);

	// Nombre del Jefe.
	pNPC->SetName(MAKE_STRING(BOSS_NAME));

	QAngle angles	= GetAbsAngles();
	angles.x		= 0.0;
	angles.z		= 0.0;

	pNPC->SetAbsAngles(angles);

	// Tiene que caer al suelo.
	pNPC->AddSpawnFlags(SF_NPC_FALL_TO_GROUND);

	// Creamos al Jefe, le decimos quien es su dios (creador) y lo activamos.
	DispatchSpawn(pNPC);
	pNPC->SetOwnerEntity(this);
	DispatchActivate(pNPC);

	// Al parecer se atoro en una pared.
	if ( !PostSpawn(pNPC) )
		return NULL;

	// Debe conocer la ubicación del jugador (Su enemigo)
	CIN_Player *pPlayer = UTIL_GetRandomInPlayer();

	if ( pPlayer )
	{
		// Ataca al jugador YA
		pNPC->SetEnemy(pPlayer);
		pNPC->UpdateEnemyMemory(pPlayer, pPlayer->GetAbsOrigin());
	}

	return pNPC;
}
Exemplo n.º 2
0
JNIEXPORT jboolean
VerifyClassCodes(JNIEnv *env, jclass cb, char *buffer, jint len)
{
    return VerifyClass(env, cb, buffer, len);
}
CVMBool
CVMclassVerify(CVMExecEnv* ee, CVMClassBlock* cb, CVMBool isRedefine)
{
#ifdef CVM_TRUSTED_CLASSLOADERS	
    CVMcbSetRuntimeFlag(cb, VERIFIED);
    return CVM_TRUE;
#else
    if (CVMcbCheckRuntimeFlag(cb, VERIFIED)) {
	return CVM_TRUE;
    }
    CVMtraceClassLoading(("CL: Verifying class %C.\n", cb));

    /* Do some quick integrity tests on interfaces. */
    if (CVMcbIs(cb, INTERFACE)) { 
        /* Interface's superclass must be java/lang/Object. */
        CVMassert((CVMcbSuperclass(cb) != NULL) &&
                  (CVMcbSuperclass(cb) == CVMsystemClass(java_lang_Object)));

        /* The following check for interface methods is not needed. The
         * method modifier flags are checked by the class format checker 
         * (in verifyformat.c). A ClassFormatError instead of VerifyError
         * is thrown for incorrect flags.
         */
#if 0
	for (i = 0; i < CVMcbMethodCount(cb); i++) {
	    CVMMethodBlock* mb = CVMcbMethodSlot(cb, i);
	    if (CVMmbIs(mb, STATIC)) {
		if (!CVMtypeidIsStaticInitializer(CVMmbNameAndTypeID(mb))) { 
		    /* Only internal interface methods can be static */
		    CVMthrowVerifyError(
                        ee, "Illegal static method %M in interface %C",
			mb, cb);
		    goto failed;
		}
	    }
	}
#endif
    } else if (CVMcbSuperclass(cb) != NULL) { 
	/*EMPTY*/
        /* Ensuring that final classes are not subclassed, and that
	 * final methods are not overridden.
	 * DEFERRED into PrepareMethods
	 */
    } else if (cb != CVMsystemClass(java_lang_Object)) {
	CVMthrowVerifyError(ee, "Class %C does not have superclass", cb);
	goto failed;
    }
	
    {
        jint       result;
        char          message[256];
	message[0] = 0;
	result = 
	    VerifyClass(ee, cb, message, sizeof(message), isRedefine);
        if (result < 0) {
	    if (!CVMexceptionOccurred(ee)) {
	        if (result == -1) {
		    CVMthrowVerifyError(ee, "%s", message);
	        } else if (result == -2) {
	            CVMthrowClassFormatError(ee, "%s", message);
                }
	    }
	    goto failed;
	}
    }
    CVMcbSetRuntimeFlag(cb, ee, VERIFIED);
    CVMtraceClassLoading(("CL: Done verifying class %C.\n", cb));
    return CVM_TRUE;

 failed:
    CVMtraceClassLoading(("CL: Failed verifying class %C.\n", cb));
    return CVM_FALSE;
#endif /* CVM_TRUSTED_CLASSLOADERS */
}
//=========================================================
// Crea un Zombi.
//=========================================================
CAI_BaseNPC *CDirectorSpawn::MakeNPC(bool Horde, bool disclosePlayer, bool checkRadius)
{
	// Desactivado
	// Esta entidad no funciona en Multiplayer.
	if ( Disabled )
		return NULL;

	// Seleccionamos una clase de NPC para crear.
	const char *pClass	= SelectRandom();
	CAI_BaseNPC *pNPC	= VerifyClass(pClass);

	// Emm... ¿puso todas las clases en "no crear"? :genius:
	if ( !pNPC )
	{
		Warning("[DIRECTOR SPAWN] Ha ocurrido un problema al intentar crear un NPC. \r\n");
		return NULL;
	}

	Vector origin;

	// Verificamos si podemos crear un zombi en el radio.
	if ( checkRadius )
	{
		if ( !CanMakeNPC(pNPC, &origin) )
			return NULL;
	}

	// Lugar de creación.
	pNPC->SetAbsOrigin(origin);

	QAngle angles	= GetAbsAngles();
	angles.x		= 0.0;
	angles.z		= 0.0;

	pNPC->SetAbsAngles(angles);

	// Tiene que caer al suelo.
	pNPC->AddSpawnFlags(SF_NPC_FALL_TO_GROUND);
	// Su cuerpo tiene que desaparecer al morir.
	pNPC->AddSpawnFlags(SF_NPC_FADE_CORPSE);

	// Creamos al NPC, le decimos quien es su dios (creador) y lo activamos.
	DispatchSpawn(pNPC);
	pNPC->SetOwnerEntity(this);
	DispatchActivate(pNPC);

	// Al parecer se atoro en una pared.
	if ( !PostSpawn(pNPC) )
		return NULL;

	// Nombre del NPC.
	pNPC->SetName(MAKE_STRING(CHILD_NAME));

#ifdef APOCALYPSE
	// Skin al azar.
	if ( pNPC->GetClassname() == "npc_zombie" )	
		pNPC->m_nSkin = random->RandomInt(1, 4);
#endif

	// Es un NPC para la horda ¡woot!
	if ( Horde )
	{
		AddHealth(pNPC);

#ifdef APOCALYPSE
		// Más rápido.
		pNPC->SetAddAccel(40);

		// No colisiona con otros NPC's. (Zombis)
		if ( random->RandomInt(1, 4) == 2 )
			pNPC->SetCollisionGroup(COLLISION_GROUP_SPECIAL_NPC);
#endif
	}

	// Debe conocer la ubicación del jugador (Su enemigo)
	if ( disclosePlayer )
	{
		CIN_Player *pPlayer = UTIL_GetRandomInPlayer();

		if ( pPlayer )
			pNPC->UpdateEnemyMemory(pPlayer, pPlayer->GetAbsOrigin());
	}

	Childs++;
	ChildsAlive++;
	LastSpawn = gpGlobals->curtime;

	OnSpawnNPC.FireOutput(pNPC, this);
	return pNPC;
}