Code:
/***********************************************************************
This file is a part of scocl project by Alexander Blade (c) 2011
***********************************************************************/
/** Edited for game consol use by JDMAlex **/
#include <natives.h>
#include <common.h>
#include <strings.h>
#include <types.h>
#include <consts.h>
#define ZOMB_MAX 20
#define ZOMB_CREATE_MIN_DIST 20.0
#define ZOMB_MODEL MODEL_M_Y_MULTIPLAYER //changed
#define FIRE_ZOMBIES // SPAWNS FIRE ZOMBIES
#define DEBUG2
#define DEBUG
//#define SET_DRUNK_CAM // ENABLES DRUNK CAM WHEN NEAR ZOMBIES.. GETS ANNOYING
void DebugBreak(char *sMessage){
#ifdef DEBUG
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", sMessage , 5000, 1);
WAIT(800);
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "Press ~PAD_A~ to continue." , 5000, 1);
while(!IS_BUTTON_JUST_PRESSED(0,0x10)) WAIT(0);
#endif
}
void DebugPrint(char *PMessage){
#ifdef DEBUG2
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", PMessage , 5000, 1);
WAIT(800);
#endif
}
void playerHater(Ped hater){
DebugPrint("playerHater(Ped hater) START");
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_PLAYER);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_COP);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_01);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_02);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_03);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_04);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_05);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_06);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_07);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_08);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_09);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_10);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_11);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_12);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_13);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_14);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_15);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_PLAYER_16);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_TEAM_1);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_TEAM_2);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_TEAM_3);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_TEAM_4);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_TEAM_5);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_TEAM_6);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_TEAM_7);
SET_CHAR_RELATIONSHIP(hater, RELATIONSHIP_HATE, RELATIONSHIP_GROUP_NETWORK_TEAM_8);
DebugPrint("playerHater(Ped hater) Finished");
}
float G_BASE_X, G_BASE_Y, G_BASE_R;
bool ZOMBGEN = true;
void CheckModelLoad(uint model)
{
DebugPrint("CheckModelLoad(uint model) START");
if ( !HAS_MODEL_LOADED(model) )
{
REQUEST_MODEL(model);
while (!HAS_MODEL_LOADED(model)) WAIT(0);
}
DebugPrint("CheckModelLoad(uint model) Finished");
}
void main(void)
{
THIS_SCRIPT_IS_SAFE_FOR_NETWORK_GAME();
G_BASE_X = -1100.0;
G_BASE_Y = 40.0;
G_BASE_R = 160.0;
Ped zombies[ZOMB_MAX];
char *anims[3];
anims[0] = "move_injured_lower";
anims[1] = "move_injured_upper";
anims[2] = "move_injured_generic";
int dm, cdm;
LOAD_CHAR_DECISION_MAKER(2, &dm); // 4
LOAD_COMBAT_DECISION_MAKER(3, &cdm); // 3 10
SET_DECISION_MAKER_ATTRIBUTE_SIGHT_RANGE(dm, 50);
SET_DECISION_MAKER_ATTRIBUTE_SIGHT_RANGE(cdm, 50);
while (TRUE)
{
WAIT(1000);
if (!ZOMBGEN)
{
int i;
for (i = 0; i < ZOMB_MAX; i++)
if ( DOES_CHAR_EXIST(zombies[i]) )
{
DebugPrint("if ( DOES_CHAR_EXIST(zombies[i]) ) == TRUE ");
DebugPrint(" EXPLODE_CHAR_HEAD(zombies[i]);");
EXPLODE_CHAR_HEAD(zombies[i]);
DebugPrint("TASK_DIE(zombies[i]);");
TASK_DIE(zombies[i]);
DebugPrint("MARK_CHAR_AS_NO_LONGER_NEEDED(&zombies[i]);");
MARK_CHAR_AS_NO_LONGER_NEEDED(&zombies[i]);
}
continue;
}
// check for player died -> delete zombies
DebugPrint("if (IS_CHAR_DEAD(GetPlayerPed()))");
if (IS_CHAR_DEAD(GetPlayerPed()))
{
DebugPrint("while (IS_CHAR_DEAD(GetPlayerPed())) WAIT(0);");
while (IS_CHAR_DEAD(GetPlayerPed())) WAIT(0);
int i;
DebugPrint("for (i = 0; i < ZOMB_MAX; i++) DELETE_CHAR(&zombies[i]);");
for (i = 0; i < ZOMB_MAX; i++) DELETE_CHAR(&zombies[i]);
DebugPrint("WAIT(3000);");
WAIT(3000);
continue;
}
// check for player was hit by zombie -> kill player
int i;
DebugPrint("boolean dropcycle = FALSE;");
boolean dropcycle = FALSE;
DebugPrint("for (i = 0; i < ZOMB_MAX; i++)");
for (i = 0; i < ZOMB_MAX; i++)
DebugPrint("if ( DOES_CHAR_EXIST(zombies[i]) )");
if ( DOES_CHAR_EXIST(zombies[i]) )
{
DebugPrint("if ( DOES_CHAR_EXIST(zombies[i]) ) == TRUE");
/*if (IS_CHAR_STOPPED(zombies[i])) //
{
Cam cam;
GET_ROOT_CAM(&cam);
float x, y, z;
GET_CHAR_COORDINATES(zombies[i], &x, &y, &z);
if (!CAM_IS_SPHERE_VISIBLE(cam, x, y, z, 5.0))
{
DELETE_CHAR(&zombies[i]);
continue;
}
}*/
DebugPrint(" if (HAS_CHAR_BEEN_DAMAGED_BY_CHAR(GetPlayerPed(), zombies[i], FALSE))");
if (HAS_CHAR_BEEN_DAMAGED_BY_CHAR(GetPlayerPed(), zombies[i], FALSE))
{
DebugPrint(" if (HAS_CHAR_BEEN_DAMAGED_BY_CHAR(GetPlayerPed(), zombies[i], FALSE)) === TRUE");
DebugPrint("TASK_DIE(GetPlayerPed());");
TASK_DIE(GetPlayerPed());
DebugPrint("EXPLODE_CHAR_HEAD(GetPlayerPed());");
EXPLODE_CHAR_HEAD(GetPlayerPed());
DebugPrint("dropcycle = TRUE;");
dropcycle = TRUE;
DebugPrint("break;");
break;
}
}
if (dropcycle) { DebugPrint("(dropcycle) ....continue;"); continue;}
DebugPrint("WAIT(100);");
WAIT(100);
if ( IS_CHAR_IN_WATER(GetPlayerPed()) ) { DebugPrint(" IS_CHAR_IN_WATER ........ continue;"); continue;
// zombie check cycle
DebugPrint("for (i = 0; i < ZOMB_MAX; i++)");
for (i = 0; i < ZOMB_MAX; i++)
{
DebugPrint("WAIT(10);");
WAIT(10);
// delete unneeded zombie and make player drunk if he is near zombie
DebugPrint("if ( DOES_CHAR_EXIST(zombies[i]) )");
if ( DOES_CHAR_EXIST(zombies[i]) )
{
DebugPrint("GET_CHAR_COORDINATES(zombies[i], &x, &y, &z);");
float x, y, z, xpl, ypl, zpl, dist;
GET_CHAR_COORDINATES(zombies[i], &x, &y, &z);
DebugPrint("GET_CHAR_COORDINATES(GetPlayerPed(), &xpl, &ypl, &zpl);");
GET_CHAR_COORDINATES(GetPlayerPed(), &xpl, &ypl, &zpl);
DebugPrint("GET_DISTANCE_BETWEEN_COORDS_3D(x, y, z, xpl, ypl, zpl, &dist);");
GET_DISTANCE_BETWEEN_COORDS_3D(x, y, z, xpl, ypl, zpl, &dist);
DebugPrint("if ( (dist < 2.0) && !IS_CHAR_IN_ANY_CAR(GetPlayerPed()) )");
if ( (dist < 2.0) && !IS_CHAR_IN_ANY_CAR(GetPlayerPed()) )
{
#ifdef SET_DRUNK_CAM
Cam cam;
DebugPrint("if ( (dist < 2.0) && !IS_CHAR_IN_ANY_CAR(GetPlayerPed()) ) == TRUE");
DebugPrint("GET_ROOT_CAM(&cam); ");
GET_ROOT_CAM(&cam);
DebugPrint("SET_DRUNK_CAM(cam, 0.8, 4000); ");
SET_DRUNK_CAM(cam, 0.8, 4000);
#endif
}
uint randint;
DebugPrint("GENERATE_RANDOM_INT_IN_RANGE(0, 3, &randint);");
GENERATE_RANDOM_INT_IN_RANGE(0, 3, &randint);
DebugPrint("if (randint == 0)");
if (randint == 0) { DebugPrint("randint == 0 SAY_AMBIENT_SPEECH(zombies[i], MOAN, 1, 1, 2);"); SAY_AMBIENT_SPEECH(zombies[i], "MOAN", 1, 1, 2);}
DebugPrint("if ( (dist > 40.0) || IS_CHAR_DEAD(zombies[i]) || IS_CHAR_IN_WATER(zombies[i]) ) ");
if ( (dist > 40.0) || IS_CHAR_DEAD(zombies[i]) || IS_CHAR_IN_WATER(zombies[i]) )
{
DebugPrint("if ( (dist > 40.0) || IS_CHAR_DEAD(zombies[i]) || IS_CHAR_IN_WATER(zombies[i]) ) == TRUE ");
DebugPrint("EXPLODE_CHAR_HEAD(zombies[i]);");
EXPLODE_CHAR_HEAD(zombies[i]);
DebugPrint("EXPLODE_CHAR_HEAD(zombies[i]);");
TASK_DIE(zombies[i]);
DebugPrint("EXPLODE_CHAR_HEAD(zombies[i]);");
MARK_CHAR_AS_NO_LONGER_NEEDED(&zombies[i]);
}
DebugPrint("continue;");
continue;
}
// if zombie doesn't exist then
float x, y, z, xdif, ydif;
while (TRUE) // find coords for zombie creation
{
DebugPrint("GENERATE_RANDOM_FLOAT_IN_RANGE(-10.0, 10.0, &xdif);");
GENERATE_RANDOM_FLOAT_IN_RANGE(-10.0, 10.0, &xdif);
DebugPrint("GENERATE_RANDOM_FLOAT_IN_RANGE(0.0, 50.0, &ydif);");
GENERATE_RANDOM_FLOAT_IN_RANGE(0.0, 50.0, &ydif);
DebugPrint("GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(GetPlayerPed(), xdif, ydif, 0.0, &x, &y, &z);");
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(GetPlayerPed(), xdif, ydif, 0.0, &x, &y, &z);
float zgrnd, wh, xpl, ypl, zpl, dist;
DebugPrint("if (GET_WATER_HEIGHT(x, y, z, &wh))");
if (GET_WATER_HEIGHT(x, y, z, &wh)) continue;
DebugPrint("GET_CHAR_COORDINATES(GetPlayerPed(), &xpl, &ypl, &zpl);");
GET_CHAR_COORDINATES(GetPlayerPed(), &xpl, &ypl, &zpl);
DebugPrint("GET_DISTANCE_BETWEEN_COORDS_3D(x, y, z, xpl, ypl, zpl, &dist);");
GET_DISTANCE_BETWEEN_COORDS_3D(x, y, z, xpl, ypl, zpl, &dist);
DebugPrint("if (dist < ZOMB_CREATE_MIN_DIST) continue;");
if (dist < ZOMB_CREATE_MIN_DIST) continue;
DebugPrint("GET_GROUND_Z_FOR_3D_COORD(x, y, z, &zgrnd);");
GET_GROUND_Z_FOR_3D_COORD(x, y, z, &zgrnd);
DebugPrint("if ( (zgrnd < z + 1.0) || (zgrnd > z - 1.0) ) ");
if ( (zgrnd < z + 1.0) || (zgrnd > z - 1.0) )
{
DebugPrint("if ( (zgrnd < z + 1.0) || (zgrnd > z - 1.0) ) === TRUE");
DebugPrint("break;");
break;
}
} // end -- find coords for zombie creation
// create zombie
uint Burn;
DebugPrint("GENERATE_RANDOM_INT_IN_RANGE(0, 3, &Burn); ");
GENERATE_RANDOM_INT_IN_RANGE(0, 3, &Burn); // ADDED for zombies to drop from the sky
DebugPrint("CheckModelLoad(ZOMB_MODEL);");
CheckModelLoad(ZOMB_MODEL);
DebugPrint("if (Burn == 0) {");
if (Burn == 0) {
#ifdef FIRE_ZOMBIES
DebugPrint("CREATE_CHAR (RELATIONSHIP_GROUP_DEALER, ZOMB_MODEL, x, y, z+50.0, &zombies[i], 1);");
CREATE_CHAR (RELATIONSHIP_GROUP_DEALER, ZOMB_MODEL, x, y, z+50.0, &zombies[i], 1);
DebugPrint("SET_CHAR_COORDINATES_NO_OFFSET(zombies[i], x, y, z+50.0);");
SET_CHAR_COORDINATES_NO_OFFSET(zombies[i], x, y, z+50.0);
DebugPrint("START_CHAR_FIRE(zombies[i]);");
START_CHAR_FIRE(zombies[i]);
#endif
}
else {
DebugPrint("else....CREATE_CHAR (RELATIONSHIP_GROUP_DEALER, ZOMB_MODEL, x, y, z, &zombies[i], 1); ");
CREATE_CHAR (RELATIONSHIP_GROUP_DEALER, ZOMB_MODEL, x, y, z, &zombies[i], 1);
DebugPrint("else....SET_CHAR_COORDINATES_NO_OFFSET(zombies[i], x, y, z); ");
SET_CHAR_COORDINATES_NO_OFFSET(zombies[i], x, y, z);
}
/**/
uint key;
DebugPrint("Setting the Zombie char features");
DebugPrint("1");GET_KEY_FOR_CHAR_IN_ROOM(GetPlayerPed(), &key);
DebugPrint("2");SET_ROOM_FOR_CHAR_BY_KEY(zombies[i], key);
/**/
//SET_CHAR_COMPONENT_VARIATION(zombies[i], 0, 3, 3);
DebugPrint("3");SET_CHAR_COMPONENT_VARIATION(zombies[i], 1, 4, 1); // Yellow Undys zombie
DebugPrint("4");SET_SENSE_RANGE(zombies[i], 50.0);
DebugPrint("5");SET_CHAR_RELATIONSHIP_GROUP(zombies[i], 24);
DebugPrint("6");SET_CHAR_RELATIONSHIP(zombies[i], 5, 0);
DebugPrint("7");SET_CHAR_DECISION_MAKER(zombies[i], dm);
DebugPrint("8");SET_COMBAT_DECISION_MAKER(zombies[i], cdm);
DebugPrint("9");SET_CHAR_AS_ENEMY(zombies[i], TRUE);
DebugPrint("10");SET_CHAR_DIES_INSTANTLY_IN_WATER(zombies[i], TRUE);
uint randint;
DebugPrint("11");GENERATE_RANDOM_INT_IN_RANGE(0, 2, &randint);
DebugPrint("12");SET_ANIM_GROUP_FOR_CHAR(zombies[i], anims[randint]);
DebugPrint("13");SET_CHAR_KEEP_TASK(zombies[i], TRUE);
DebugPrint("14");TASK_COMBAT(zombies[i], GetPlayerPed());
DebugPrint("15");SET_CHAR_WILL_USE_CARS_IN_COMBAT(zombies[i], FALSE);
DebugPrint("16");SET_CHAR_MONEY(zombies[i], 0);
DebugPrint("17");SET_PED_IS_BLIND_RAGING(zombies[i], TRUE);
DebugPrint("18");SET_PED_GENERATES_DEAD_BODY_EVENTS(zombies[i], TRUE);
DebugPrint("19");SET_PED_PATH_MAY_USE_CLIMBOVERS(zombies[i], TRUE);
DebugPrint("21");SET_PED_PATH_MAY_DROP_FROM_HEIGHT(zombies[i], TRUE);
DebugPrint("22");SET_PED_PATH_MAY_USE_LADDERS(zombies[i], FALSE);
DebugPrint("23");SET_PED_DONT_DO_EVASIVE_DIVES(zombies[i], TRUE);
DebugPrint("24");SET_CHAR_WILL_USE_COVER(zombies[i], FALSE);
DebugPrint("25");UpdateWeaponOfPed(zombies[i], WEAPON_KNIFE);
DebugPrint("26");SET_CURRENT_CHAR_WEAPON(zombies[i], WEAPON_KNIFE, true);
DebugPrint("27");SET_CHAR_CURRENT_WEAPON_VISIBLE(zombies[i], false);
DebugPrint("28");playerHater(zombies[i]);
float randfloat;
DebugPrint("29");GENERATE_RANDOM_FLOAT_IN_RANGE(0.0, 0.5, &randfloat);
DebugPrint("30");SET_CHAR_MOVE_ANIM_SPEED_MULTIPLIER(zombies[i], 1.2 + randfloat);
DebugPrint("31");CANCEL_CURRENTLY_PLAYING_AMBIENT_SPEECH(zombies[i]);
DebugPrint("32");SET_AMBIENT_VOICE_NAME(zombies[i], "M_ZOMBIE");
DebugPrint("33");SAY_AMBIENT_SPEECH(zombies[i], "MOAN", 1, 1, 2);
DebugPrint("FINISHED SCRIPT ..... BACK TO TOP");
}
}
}
}