Русское сообщество по скриптингу

How can i add second ball in soccerjam?

Scripting help for english speaking users. While not very active, you still have a chance to get help here.
Правила форума
We cannot maintain english version version of our forum rules, but shortly (it's simple) - Don't be a dick. If you really want to know our rules you should check appropriate thread.

How can i add second ball in soccerjam?

Сообщение VenomIvanof » 22 апр 2016, 22:32

I want to add a second ball in the soccerjam mod. How can i add it?
Аватара пользователя
VenomIvanof
 
Сообщения: 66
Зарегистрирован: 02 апр 2016, 13:26
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Языки программирования: Counter-Strike 1.6

Re: How can i add second ball in soccerjam?

Сообщение Pafos » 22 апр 2016, 22:38

VenomIvanof, attach source code
Аватара пользователя
Pafos
 
Сообщения: 574
Зарегистрирован: 07 апр 2014, 18:03
Откуда: pfnClientConnect
Забанен
Благодарил (а): 129 раз.
Поблагодарили: 97 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn

Re: How can i add second ball in soccerjam?

Сообщение VenomIvanof » 22 апр 2016, 22:52

Код: Выделить всё
#pragma dynamic 131072 //I used to much memory =(
/*
 *   CVARs:
 *      - These CVARS can be changed at any time during round!
 *      sj_kick       (default: 650)   - Default Kicking Speed.
 *      sj_score       (default: 15)   - Scores needed to win a round.
 *      sj_reset       (default: 30.0)   - Ball reset time, to respawn at ball spawn location.
 *      sj_goalsafety    (default: 650)   - Distance around Mascot, that does damage to enemy.
 *      sj_random      (default: 1)   - Turns Team Randomizing ON/OFF.
 *
 *   Requires:   AMXX 1.75+
 *
 *   Author:      OneEyed
 *   IRC:      #soccerjam (irc.gamesurge.net)
 *   Website:   Вы должны зарегистрироваться, чтобы видеть ссылки.
 */

/* ------------------------------------------------------------------------- */
/* /----------------------- START OF CUSTOMIZATION  -----------------------/ */
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* /------------  CUSTOM DEFINES  ------------ CUSTOM DEFINES  ------------/ */
/* ------------------------------------------------------------------------- */

// Disable knife disarm ? (Leaves only ball disarm)
// Comment this define to disable.
#define KNIFE_DISARM_ON

//When player reaches MAX level, they receive this many levels.
#define MAX_LVL_BONUS 1

//Max levels for each upgrade
#define MAX_LVL_STAMINA      5
#define MAX_LVL_STRENGTH   5
#define MAX_LVL_AGILITY      5
#define MAX_LVL_DEXTERITY   5
#define MAX_LVL_DISARM      5
#define MAX_LVL_POWERPLAY   5

//Prices for each upgrade.
//price = ((UpgradeLevel * UpgradePrice) / 2) + UpgradePrice
#define EXP_PRICE_STAMINA   220
#define EXP_PRICE_STRENGTH   200
#define EXP_PRICE_AGILITY   300
#define EXP_PRICE_DEXTERITY   200
#define EXP_PRICE_DISARM   200

//Experience per stat.
#define EXP_GOALY   100 //for goaly save and goaly points.
#define EXP_STEAL    100
#define EXP_KILL    100
#define EXP_ASSIST   200
#define EXP_GOAL   100

#define BASE_HP 100           //starting hp
#define BASE_SPEED    250.0    //starting run speed
#define BASE_DISARM   10       //starting disarm from lvl 1

#define COUNTDOWN_TIME 10   //Countdown time between rounds.
#define GOALY_DELAY 8.0      //Delay for goaly exp

//Curve Ball Defines
#define CURVE_ANGLE      15   //Angle for spin kick multipled by current direction.
#define CURVE_COUNT      6   //Curve this many times.
#define CURVE_TIME      0.2   //Time to curve again.
#define DIRECTIONS      2   //# of angles allowed.
#define   ANGLEDIVIDE      6   //Divide angle this many times for curve.

//Misc. amounts
#define AMOUNT_LATEJOINEXP   100   //latejoinexp * each scored point.
#define AMOUNT_POWERPLAY    5   //added bonus to STR and AGI per powerplay lvl.
#define AMOUNT_GOALY       7   //Goaly camper exp

//Amount of points for each upgrade.
#define AMOUNT_STA       20   //Health per lvl
#define AMOUNT_STR       30   //Stronger kicking per lvl
#define AMOUNT_AGI       13   //Faster Speed per lvl
#define AMOUNT_DEX       10   //Better Catching
#define AMOUNT_DISARM    2   //Disarm ball chance (disarm lvl * this) if random num 1-100 < disarm

#define DISARM_MULTIPLIER 3
/* ------------------------------------------------------------------------- */
/* /----------------  TEAM NAMES  ------------ TEAM NAMES  ------------/ */
/* ------------------------------------------------------------------------- */

#define TEAMS 4 //Don't edit this.

//Names to be put on scoreboard.
static const TeamNames[TEAMS][] = {
   "NULL",
   "Terr",   //Terrorist Team
   "CT",   //CT Team
   "NULL"
}
/* ------------------------------------------------------------------------- */
/* /----------------  MODELS  ---------------- MODELS  ----------------/ */
/* ------------------------------------------------------------------------- */
//You may change the ball model. Just give correct path of new model.
new ball[] = "models/kickball/ball.mdl"

static const TeamMascots[2][] = {
   "models/kingpin.mdl",   //TERRORIST MASCOT
   "models/garg.mdl"      //CT MASCOT
}
/* ------------------------------------------------------------------------- */
/* /----------------  COLORS  ---------------- COLORS  ----------------/ */
/* ------------------------------------------------------------------------- */
//Format is RGB 0-255

//TEAM MODEL GLOW COLORS
#define TERR_GLOW_RED   250
#define TERR_GLOW_GREEN   10
#define   TERR_GLOW_BLUE   10

#define CT_GLOW_RED      10
#define   CT_GLOW_GREEN   10
#define CT_GLOW_BLUE   250

//TEAM HUD METER COLOR (Turbo/Curve Angle meters)
#define TERR_METER_RED      250
#define TERR_METER_GREEN   10
#define   TERR_METER_BLUE      10

#define CT_METER_RED   10
#define   CT_METER_GREEN   10
#define CT_METER_BLUE   250

//BALL GLOW COLOR (default: yellow) //it glows only one color
#define BALL_RED   255
#define BALL_GREEN   200
#define BALL_BLUE   100

//BALL BEAM
#define BALL_BEAM_WIDTH      5
#define BALL_BEAM_LIFE      10
#define BALL_BEAM_RED      250
#define BALL_BEAM_GREEN      80
#define BALL_BEAM_BLUE      10
#define BALL_BEAM_ALPHA      175

/* ------------------------------------------------------------------------- */
/* /----------------  SOUNDS  ---------------- SOUNDS  ----------------/ */
/* ------------------------------------------------------------------------- */
//-- NOTE: Sounds must be located in sound/kickball/ folder.

new BALL_BOUNCE_GROUND[] = "kickball/bounce.wav"
new BALL_RESPAWN[] = "kickball/returned.wav"
new BALL_KICKED[] = "kickball/kicked.wav"
new BALL_PICKED_UP[] = "kickball/gotball.wav"
new UPGRADED_MAX_LEVEL[] = "kickball/levelup.wav"
new ROUND_START[] = "kickball/prepare.wav"
new SCORED_GOAL[] = "kickball/distress.wav"
new STOLE_BALL_FAST[] = "kickball/pussy.wav"

//When a goal is scored, one of these will randomly play.
#define MAX_SOUNDS 6
new SCORED_SOUNDS[MAX_SOUNDS][] = {
   "kickball/amaze.wav",
   "kickball/laugh.wav",
   "kickball/perfect.wav",
   "kickball/diebitch.wav",
   "kickball/bday.wav",
   "kickball/boomchakalaka.wav"
}
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* /------------------------ END OF CUSTOMIZATION  ------------------------/ */
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */

/* ------------ DO NOT EDIT BELOW ---------------------------------------------------------- */
/* -------------------------- DO NOT EDIT BELOW -------------------------------------------- */
/* --------------------------------------- DO NOT EDIT BELOW ------------------------------- */
/* ---------------------------------------------------- DO NOT EDIT BELOW ------------------ */

#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fun>

static const AUTHOR[] = "OneEyed"
static const VERSION[] = "2.07a"

#define MAX_TEXT_BUFFER      2047
#define MAX_NAME_LENGTH      33
#define MAX_PLAYER         33
#define MAX_ASSISTERS      3
#define MAX_BALL_SPAWNS      5
#define POS_X       -1.0
#define POS_Y       0.85
#define HUD_CHANNEL 4
#define MESSAGE_DELAY 4.0

enum {
   UNASSIGNED = 0,
   T,
   CT,
   SPECTATOR
}

#define RECORDS 6
enum {
   GOAL = 1,
   ASSIST,
   STEAL,
   KILL,
   DISTANCE,
   GOALY
}

#define UPGRADES 5
enum {
   STA = 1,   //stamina
   STR,      //strength
   AGI,      //agility
   DEX,      //dexterity
   DISARM,
}

static const UpgradeTitles[UPGRADES+1][] = {
   "NULL",
   "Stamina",
   "Strength",
   "Agility",
   "Dexterity",
   "Disarm"
}

new const UpgradeMax[UPGRADES+1] = {
   0, //NULL
   MAX_LVL_STAMINA,    //STAMINA
   MAX_LVL_STRENGTH,    //STRENGTH
   MAX_LVL_AGILITY,    //AGILITY
   MAX_LVL_DEXTERITY,    //DEXTERITY
   MAX_LVL_DISARM,    //DISARM
}

new const UpgradePrice[UPGRADES+1] = {
   0, //NULL
   EXP_PRICE_STAMINA,
   EXP_PRICE_STRENGTH,
   EXP_PRICE_AGILITY,
   EXP_PRICE_DEXTERITY,
   EXP_PRICE_DISARM,
}

new TeamColors[TEAMS][3] =
{
   { 0, 0, 0 },
   { TERR_GLOW_RED, TERR_GLOW_GREEN, TERR_GLOW_BLUE } ,
   { CT_GLOW_RED, CT_GLOW_GREEN, CT_GLOW_BLUE },
   { 0, 0, 0 }
}

new TeamMeterColors[TEAMS][3] =
{
   { 0, 0, 0 },
   { TERR_METER_RED, TERR_METER_GREEN, TERR_METER_BLUE } ,
   { CT_METER_RED, CT_METER_GREEN, CT_METER_BLUE },
   { 0, 0, 0 }
}


new ballcolor[3] = { BALL_RED, BALL_GREEN, BALL_BLUE }
new PlayerUpgrades[MAX_PLAYER][UPGRADES+1]
new GoalEnt[TEAMS]
new PressedAction[MAX_PLAYER]
new seconds[MAX_PLAYER]
new g_sprint[MAX_PLAYER]
new SideJump[MAX_PLAYER]
new Float:SideJumpDelay[MAX_PLAYER]
new PlayerDeaths[MAX_PLAYER]
new PlayerKills[MAX_PLAYER]
new curvecount
new direction
new maxplayers
new Float:BallSpinDirection[3]
new ballspawncount
new Float:TeamBallOrigins[TEAMS][3]
new Float:TEMP_TeamBallOrigins[3]
new Mascots[TEAMS]
new Float:MascotsOrigins[3]
new Float:MascotsAngles[3]
new menu_upgrade[MAX_PLAYER]
new Float:fire_delay
new winner
new Float:GoalyCheckDelay[MAX_PLAYER]
new GoalyCheck[MAX_PLAYER]
new GoalyPoints[MAX_PLAYER]
new Float:BallSpawnOrigin[MAX_BALL_SPAWNS][3]
new TopPlayer[2][RECORDS+1]
new MadeRecord[MAX_PLAYER][RECORDS+1]
new TopPlayerName[RECORDS+1][MAX_NAME_LENGTH]
new g_Experience[MAX_PLAYER]
new timer
new Float:testorigin[3]
new Float:velocity[3]
new score[TEAMS]
new scoreboard[1025]
new temp1[64], temp2[64]
new distorig[2][3] //distance recorder
new gmsgShake
new gmsgDeathMsg
new gmsgSayText
new gmsgTextMsg
new goaldied[MAX_PLAYER]
new bool:is_dead[MAX_PLAYER]
new terr[33], ct[33], cntCT, cntT
new PowerPlay, powerplay_list[MAX_LVL_POWERPLAY+1]
new assist[16]
new iassist[TEAMS]
new gamePlayerEquip
new CVAR_SCORE
new CVAR_RESET
new CVAR_GOALSAFETY
new CVAR_KICK
new Float:CVAR_RESPAWN
new CVAR_RANDOM
new fire
new smoke
new beamspr
new g_fxBeamSprite
new Burn_Sprite
new ballholder
new ballowner
new aball
new is_kickball
new g_TimeLimit;
new bool:has_knife[MAX_PLAYER]

new OFFSET_INTERNALMODEL;

/*====================================================================================================
 [Precache]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
PrecacheSounds() {
   new x
   for(x=0;x<MAX_SOUNDS;x++)
      engfunc( EngFunc_PrecacheSound, SCORED_SOUNDS[x])

   engfunc( EngFunc_PrecacheSound, STOLE_BALL_FAST)
   engfunc( EngFunc_PrecacheSound, ROUND_START)
   engfunc( EngFunc_PrecacheSound, BALL_BOUNCE_GROUND)
   engfunc( EngFunc_PrecacheSound, BALL_PICKED_UP)
   engfunc( EngFunc_PrecacheSound, BALL_RESPAWN)
   engfunc( EngFunc_PrecacheSound, SCORED_GOAL)
   engfunc( EngFunc_PrecacheSound, BALL_KICKED)
   engfunc( EngFunc_PrecacheSound, UPGRADED_MAX_LEVEL)
}

PrecacheBall() {
   engfunc( EngFunc_PrecacheModel, ball)
}

PrecacheMonsters(team) {
   engfunc( EngFunc_PrecacheModel, TeamMascots[team-1])
}

PrecacheSprites() {
   beamspr = engfunc( EngFunc_PrecacheModel,"sprites/laserbeam.spr")
   fire = engfunc( EngFunc_PrecacheModel,"sprites/shockwave.spr")
   smoke = engfunc( EngFunc_PrecacheModel,"sprites/steam1.spr")
   Burn_Sprite = engfunc( EngFunc_PrecacheModel,"sprites/xfireball3.spr")
   g_fxBeamSprite = engfunc( EngFunc_PrecacheModel,"sprites/lgtning.spr")
}

PrecacheOther() {
   engfunc( EngFunc_PrecacheModel, "models/chick.mdl")
}

/*====================================================================================================
 [Initialize]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
public plugin_init() {

   new mapname[64]
   get_mapname(mapname,63)

   register_cvar("soccer_jam_online", "0", FCVAR_SERVER)
   register_cvar("soccer_jam_version", VERSION, FCVAR_SERVER)
   set_cvar_string("soccer_jam_version", VERSION)
   register_dictionary("soccerjam.txt")
   register_dictionary("soccerjam_help.txt")
   if(is_kickball > 0)
   {
      PrecacheSprites()

      register_plugin("Soccer Jam(ON)", VERSION, AUTHOR)
      set_cvar_num("soccer_jam_online", 1)

      timer = COUNTDOWN_TIME

      gmsgTextMsg = get_user_msgid("TextMsg")
      gmsgDeathMsg = get_user_msgid("DeathMsg")
      gmsgShake = get_user_msgid("ScreenShake")
      gmsgSayText = get_user_msgid("SayText")

      maxplayers = get_maxplayers()

      if(equali(mapname,"soccerjam")) {
         PrecacheOther()
         CreateGoalNets()
         create_wall()
      }

      register_clcmd("say","handle_say")

      register_event("ResetHUD", "Event_ResetHud", "be")
      register_event("HLTV","Event_StartRound","a","1=0","2=0")
      register_event("Damage", "Event_Damage", "b", "2!0", "3=0", "4!0" )

      CVAR_SCORE = register_cvar("sj_score","15")
      CVAR_RESET = register_cvar("sj_reset","30.0")
      CVAR_GOALSAFETY = register_cvar("sj_goalsafety","650")
      CVAR_KICK = register_cvar("sj_kick","650")
      CVAR_RESPAWN = 2.0 //register_cvar("kickball_respawn","2.0")
      CVAR_RANDOM = register_cvar("sj_random","1")
      register_cvar( "sj_timelimit", "0" );
      
      register_cvar("SCORE_CT","0")
      register_cvar("SCORE_T","0")

      register_menucmd(register_menuid("Team_Select",1), (1<<0)|(1<<1)|(1<<4)|(1<<5), "team_select")

      register_touch("PwnBall", "player",          "touchPlayer")
      register_touch("PwnBall", "soccerjam_goalnet",   "touchNet")

      register_touch("PwnBall", "worldspawn",         "touchWorld")
      register_touch("PwnBall", "func_wall",         "touchWorld")
      register_touch("PwnBall", "func_door",         "touchWorld")
      register_touch("PwnBall", "func_door_rotating", "touchWorld")
      register_touch("PwnBall", "func_wall_toggle",   "touchWorld")
      register_touch("PwnBall", "func_breakable",      "touchWorld")
      register_touch("PwnBall", "Blocker",         "touchBlocker")

      set_task(0.4,"meter",0,_,_,"b")
      set_task(0.5,"statusDisplay",7654321,"",0,"b")

      register_think("PwnBall","ball_think")
      register_think("Mascot", "mascot_think")

      register_clcmd("radio1", "LeftDirection", 0)
      register_clcmd("radio2", "RightDirection", 0)
      register_clcmd("drop","Turbo")
         register_clcmd("lastinv","BuyUpgrade")
         register_clcmd("fullupdate","fullupdate")
         register_message(gmsgTextMsg, "editTextMsg")

         register_event("ShowMenu", "menuclass", "b", "4&CT_Select", "4&Terrorist_Select");
         register_event("VGUIMenu", "menuclass", "b", "1=26", "1=27");

         OFFSET_INTERNALMODEL = is_amd64_server() ? 152 : 126;
   }
   else {
      register_plugin("Soccer Jam(OFF)", VERSION, AUTHOR)
      set_cvar_num("soccer_jam_online",0)
   }
   return PLUGIN_HANDLED
}

//public plugin_end() {
   //server_cmd("mp_timelimit %i", g_TimeLimit)
//}

/*====================================================================================================
 [Initialize Entities]

 Purpose:   Handles our custom entities, created with Valve Hammer, and fixes for soccerjam.bsp.

 Comment:   $$

====================================================================================================*/
public pfn_keyvalue(entid) {

   new classname[32], key[32], value[32]
   copy_keyvalue(classname, 31, key, 31, value, 31)

   new temp_origins[3][10], x, team
   new temp_angles[3][10]

   if(equal(key, "classname") && equal(value, "soccerjam_goalnet"))
      DispatchKeyValue("classname", "func_wall")

   if(equal(classname, "game_player_equip")){
      if(!is_kickball || !gamePlayerEquip)
         gamePlayerEquip = entid
      else {
         remove_entity(entid)
      }
   }
   else if(equal(classname, "func_wall"))
   {
      if(equal(key, "team"))
      {
         team = str_to_num(value)
         if(team == 1 || team == 2) {
            GoalEnt[team] = entid
            set_task(1.0, "FinalizeGoalNet", team)
         }
      }
   }
   else if(equal(classname, "soccerjam_mascot"))
   {

      if(equal(key, "team"))
      {
         team = str_to_num(value)
         create_mascot(team)
      }
      else if(equal(key, "origin"))
      {
         parse(value, temp_origins[0], 9, temp_origins[1], 9, temp_origins[2], 9)
         for(x=0; x<3; x++)
            MascotsOrigins[x] = floatstr(temp_origins[x])
      }
      else if(equal(key, "angles"))
      {
         parse(value, temp_angles[0], 9, temp_angles[1], 9, temp_angles[2], 9)
         for(x=0; x<3; x++)
            MascotsAngles[x] = floatstr(temp_angles[x])
      }
   }
   else if(equal(classname, "soccerjam_teamball"))
   {
      if(equal(key, "team"))
      {
         team = str_to_num(value)
         for(x=0; x<3; x++)
            TeamBallOrigins[team][x] = TEMP_TeamBallOrigins[x]
      }
      else if(equal(key, "origin"))
      {
         parse(value, temp_origins[0], 9, temp_origins[1], 9, temp_origins[2], 9)
         for(x=0; x<3; x++)
            TEMP_TeamBallOrigins[x] = floatstr(temp_origins[x])
      }
   }
   else if(equal(classname, "soccerjam_ballspawn"))
   {
      if(equal(key, "origin")) {
         is_kickball = 1

         create_Game_Player_Equip()

         PrecacheBall()
         PrecacheSounds()

         if(ballspawncount < MAX_BALL_SPAWNS) {
            parse(value, temp_origins[0], 9, temp_origins[1], 9, temp_origins[2], 9)

            BallSpawnOrigin[ballspawncount][0] = floatstr(temp_origins[0])
            BallSpawnOrigin[ballspawncount][1] = floatstr(temp_origins[1])
            BallSpawnOrigin[ballspawncount][2] = floatstr(temp_origins[2]) + 10.0

            ballspawncount++
         }
      }
   }
}

createball() {

   new entity = create_entity("info_target")
   if (entity) {

      entity_set_string(entity,EV_SZ_classname,"PwnBall")
      entity_set_model(entity, ball)

      entity_set_int(entity, EV_INT_solid, SOLID_BBOX)
      entity_set_int(entity, EV_INT_movetype, MOVETYPE_BOUNCE)

      new Float:MinBox[3]
      new Float:MaxBox[3]
      MinBox[0] = -15.0
      MinBox[1] = -15.0
      MinBox[2] = 0.0
      MaxBox[0] = 15.0
      MaxBox[1] = 15.0
      MaxBox[2] = 12.0

      entity_set_vector(entity, EV_VEC_mins, MinBox)
      entity_set_vector(entity, EV_VEC_maxs, MaxBox)

      glow(entity,ballcolor[0],ballcolor[1],ballcolor[2],10)

      entity_set_float(entity,EV_FL_framerate,0.0)
      entity_set_int(entity,EV_INT_sequence,0)
   }
   //save our entity ID to aball variable
   aball = entity
   entity_set_float(entity,EV_FL_nextthink,halflife_time() + 0.05)
   return PLUGIN_HANDLED
}


CreateGoalNets() {

   new endzone, x
   new Float:orig[3]
   new Float:MinBox[3], Float:MaxBox[3]

   for(x=1;x<3;x++) {
      endzone = create_entity("info_target")
      if (endzone) {

         entity_set_string(endzone,EV_SZ_classname,"soccerjam_goalnet")
         entity_set_model(endzone, "models/chick.mdl")
         entity_set_int(endzone, EV_INT_solid, SOLID_BBOX)
         entity_set_int(endzone, EV_INT_movetype, MOVETYPE_NONE)

         MinBox[0] = -25.0;   MinBox[1] = -145.0;   MinBox[2] = -36.0
         MaxBox[0] =  25.0;   MaxBox[1] =  145.0;   MaxBox[2] =  70.0

         entity_set_vector(endzone, EV_VEC_mins, MinBox)
         entity_set_vector(endzone, EV_VEC_maxs, MaxBox)

         switch(x) {
            case 1: {
               orig[0] = 2110.0
               orig[1] = 0.0
               orig[2] = 1604.0
            }
            case 2: {
               orig[0] = -2550.0
               orig[1] = 0.0
               orig[2] = 1604.0
            }
         }

         entity_set_origin(endzone,orig)

         entity_set_int(endzone, EV_INT_team, x)
         set_entity_visibility(endzone, 0)
         GoalEnt[x] = endzone
      }
   }

}

create_wall() {
   new wall = create_entity("func_wall")
   if(wall)
   {
      new Float:orig[3]
      new Float:MinBox[3], Float:MaxBox[3]
      entity_set_string(wall,EV_SZ_classname,"Blocker")
      entity_set_model(wall, "models/chick.mdl")

      entity_set_int(wall, EV_INT_solid, SOLID_BBOX)
      entity_set_int(wall, EV_INT_movetype, MOVETYPE_NONE)

      MinBox[0] = -72.0;   MinBox[1] = -100.0;   MinBox[2] = -72.0
      MaxBox[0] =  72.0;   MaxBox[1] =  100.0;   MaxBox[2] =  72.0

      entity_set_vector(wall, EV_VEC_mins, MinBox)
      entity_set_vector(wall, EV_VEC_maxs, MaxBox)

      orig[0] = 2355.0
      orig[1] = 1696.0
      orig[2] = 1604.0
      entity_set_origin(wall,orig)
      set_entity_visibility(wall, 0)
   }
}

create_mascot(team)
{
   new Float:MinBox[3], Float:MaxBox[3]
   new mascot = create_entity("info_target")
   if(mascot)
   {
      PrecacheMonsters(team)
      entity_set_string(mascot,EV_SZ_classname,"Mascot")
      entity_set_model(mascot, TeamMascots[team-1])
      Mascots[team] = mascot

      entity_set_int(mascot, EV_INT_solid, SOLID_NOT)
      entity_set_int(mascot, EV_INT_movetype, MOVETYPE_NONE)
      entity_set_int(mascot, EV_INT_team, team)
      MinBox[0] = -16.0;   MinBox[1] = -16.0;   MinBox[2] = -72.0
      MaxBox[0] =  16.0;   MaxBox[1] =  16.0;   MaxBox[2] =  72.0
      entity_set_vector(mascot, EV_VEC_mins, MinBox)
      entity_set_vector(mascot, EV_VEC_maxs, MaxBox)
      //orig[2] += 200.0

      entity_set_origin(mascot,MascotsOrigins)
      entity_set_float(mascot,EV_FL_animtime,2.0)
      entity_set_float(mascot,EV_FL_framerate,1.0)
      entity_set_int(mascot,EV_INT_sequence,0)

      if(team == 2)
         entity_set_byte(mascot, EV_BYTE_controller1, 115)

      entity_set_vector(mascot,EV_VEC_angles,MascotsAngles)
      entity_set_float(mascot,EV_FL_nextthink,halflife_time() + 1.0)
   }
}

create_Game_Player_Equip() {
   gamePlayerEquip = create_entity("game_player_equip")
   if(gamePlayerEquip) {
      //DispatchKeyValue(gamePlayerEquip, "weapon_knife", "1")
      //DispatchKeyValue(entity, "weapon_scout", "1")
      DispatchKeyValue(gamePlayerEquip, "targetname", "roundstart")
      DispatchSpawn(gamePlayerEquip)
   }

}

public FinalizeGoalNet(team)
{
   new goalnet = GoalEnt[team]
   entity_set_string(goalnet,EV_SZ_classname,"soccerjam_goalnet")
   entity_set_int(goalnet, EV_INT_team, team)
   set_entity_visibility(goalnet, 0)
}

public RightDirection(id) {

   if(id == ballholder) {

      direction--
      if(direction < -(DIRECTIONS))
         direction = -(DIRECTIONS)
      new temp = direction * CURVE_ANGLE
      SendCenterText( id, temp );
      
   }
   else
      client_print(id, print_chat, "%L", id, "CANT_CURVE_RIGHT");
   return PLUGIN_HANDLED
}

public LeftDirection(id) {
   if(id == ballholder) {
      direction++
      if(direction > DIRECTIONS)
         direction = DIRECTIONS
      new temp = direction * CURVE_ANGLE
      SendCenterText( id, temp );
      
   }
   else {
      client_print(id, print_chat, "%L", id, "CANT_CURVE_LEFT");
   }
   return PLUGIN_HANDLED
}


SendCenterText( id, dir )
{
   if(dir < 0)
      client_print(id, print_center, "%L", id, "CURVING_RIGHT", (dir<0?-(dir):dir));
   else if(dir == 0)
      client_print(id, print_center, "0 degrees");
   else if(dir > 0)
      client_print(id, print_center, "%L", id, "CURVING_LEFT", (dir<0?-(dir):dir));
}

public plugin_cfg() {
   if(is_kickball) {
      server_cmd("sv_maxspeed 999")
      server_cmd("sv_airaccelerate 10")
      
      //Fallback to make sure our mp_timelimit is correct.
      new mpTimelimit = get_cvar_num("mp_timelimit");
      new sjTimelimit = get_cvar_num("sj_timelimit");
      
      if( mpTimelimit > 3 )
         set_cvar_num("sj_timelimit", mpTimelimit);
      else {
         if(mpTimelimit && sjTimelimit > 3 )
            set_cvar_num("mp_timelimit", sjTimelimit);
      }
         
   }
   else {
      //server_cmd("exec server.cfg")
      new failed[64];
      format(failed,63,"%L", LANG_SERVER, "PLUGIN_FAILED");
      set_fail_state(failed);
   }
}

/*====================================================================================================
 [Ball Brain]

 Purpose:   These functions help control the ball and its activities.

 Comment:   $$

====================================================================================================*/
public ball_think() {

   new maxscore = get_pcvar_num(CVAR_SCORE)
   if(score[1] >= maxscore || score[2] >= maxscore) {
      entity_set_float(aball,EV_FL_nextthink,halflife_time() + 0.05)
      return PLUGIN_HANDLED
   }

   if(is_valid_ent(aball))
   {

      new Float:gametime = get_gametime()
      if(PowerPlay >= MAX_LVL_POWERPLAY && gametime - fire_delay >= 0.3)
         on_fire()

      if(ballholder > 0)
      {
         new team = get_user_team(ballholder)
         entity_get_vector(ballholder, EV_VEC_origin,testorigin)


         if(!is_user_alive(ballholder)) {

            new tname[32]
            get_user_name(ballholder,tname,31)

            remove_task(55555)
            set_task(get_pcvar_float(CVAR_RESET),"clearBall",55555)

            if(!g_sprint[ballholder])
               set_speedchange(ballholder)

            format(temp1,63,"%L", LANG_PLAYER, "DROPPED_BALL", TeamNames[team], tname)

            //remove glow of owner and set ball velocity really really low
            glow(ballholder,0,0,0,0)

            ballowner = ballholder
            ballholder = 0

            testorigin[2] += 5
            entity_set_origin(aball, testorigin)

            new Float:vel[3], x
            for(x=0;x<3;x++)
               vel[x] = 1.0

            entity_set_vector(aball,EV_VEC_velocity,vel)
            entity_set_float(aball,EV_FL_nextthink,halflife_time() + 0.05)
            return PLUGIN_HANDLED
         }
         if(entity_get_int(aball,EV_INT_solid) != SOLID_NOT)
            entity_set_int(aball, EV_INT_solid, SOLID_NOT)

         //Put ball in front of player
         ball_infront(ballholder, 55.0)
         new i
         for(i=0;i<3;i++)
            velocity[i] = 0.0
         //Add lift to z axis
         new flags = entity_get_int(ballholder, EV_INT_flags)
         if(flags & FL_DUCKING)
            testorigin[2] -= 10
         else
            testorigin[2] -= 30

         entity_set_vector(aball,EV_VEC_velocity,velocity)
           entity_set_origin(aball,testorigin)
      }
      else {
         if(entity_get_int(aball,EV_INT_solid) != SOLID_BBOX)
            entity_set_int(aball, EV_INT_solid, SOLID_BBOX)
      }
   }
   entity_set_float(aball,EV_FL_nextthink,halflife_time() + 0.05)
   return PLUGIN_HANDLED
}

moveBall(where, team=0) {

   if(is_valid_ent(aball)) {
      if(team) {
         new Float:bv[3]
         bv[2] = 50.0
         entity_set_origin(aball, TeamBallOrigins[team])
         entity_set_vector(aball,EV_VEC_velocity,bv)
      }
      else {
         switch(where) {
            case 0: { //outside map
               new Float:orig[3], x
               for(x=0;x<3;x++)
                  orig[x] = -9999.9
               entity_set_origin(aball,orig)
               ballholder = -1
            }
            case 1: { //at middle

               new Float:v[3], rand
               v[2] = 400.0
               if(ballspawncount > 1)
                  rand = random_num(0, ballspawncount-1)
               else
                  rand = 0

               entity_set_origin(aball, BallSpawnOrigin[rand])
               entity_set_vector(aball, EV_VEC_velocity, v)

               PowerPlay = 0
               ballholder = 0
               ballowner = 0
            }
         }
      }
   }
}

public ball_infront(id, Float:dist) {

   new Float:nOrigin[3]
   new Float:vAngles[3] // plug in the view angles of the entity
   new Float:vReturn[3] // to get out an origin fDistance away

   entity_get_vector(aball,EV_VEC_origin,testorigin)
   entity_get_vector(id,EV_VEC_origin,nOrigin)
   entity_get_vector(id,EV_VEC_v_angle,vAngles)


   vReturn[0] = floatcos( vAngles[1], degrees ) * dist
   vReturn[1] = floatsin( vAngles[1], degrees ) * dist

   vReturn[0] += nOrigin[0]
   vReturn[1] += nOrigin[1]

   testorigin[0] = vReturn[0]
   testorigin[1] = vReturn[1]
   testorigin[2] = nOrigin[2]

   /*
   //Sets the angle to face the same as the player.
   new Float:ang[3]
   entity_get_vector(id,EV_VEC_angles,ang)
   ang[0] = 0.0
   ang[1] -= 90.0
   ang[2] = 0.0
   entity_set_vector(aball,EV_VEC_angles,ang)
   */
}


public CurveBall(id) {
   if(direction && get_speed(aball) > 5 && curvecount > 0) {

      new Float:dAmt = float((direction * CURVE_ANGLE) / ANGLEDIVIDE);
      new Float:v[3], Float:v_forward[3];
      
      entity_get_vector(aball, EV_VEC_velocity, v);
      vector_to_angle(v, BallSpinDirection);

      BallSpinDirection[1] = normalize( BallSpinDirection[1] + dAmt );
      BallSpinDirection[2] = 0.0;
      
      angle_vector(BallSpinDirection, 1, v_forward);
      
      new Float:speed = vector_length(v)// * 0.95;
      v[0] = v_forward[0] * speed
      v[1] = v_forward[1] * speed
      
      entity_set_vector(aball, EV_VEC_velocity, v);

      curvecount--;
      set_task(CURVE_TIME, "CurveBall", id);
   }
}

public clearBall() {
   play_wav(0, BALL_RESPAWN);
   format(temp1,63,"%L",LANG_PLAYER,"BALL_RESPAWNED")
   moveBall(1)
}

/*====================================================================================================
 [Mascot Think]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
public mascot_think(mascot)
{
   new team = entity_get_int(mascot, EV_INT_team)
   new indist[32], inNum, chosen

   new id, playerteam, dist
   for(id=1 ; id<=maxplayers ; id++)
   {
      if(is_user_alive(id) && !is_user_bot(id))
      {
         playerteam = get_user_team(id)
         if(playerteam != team)
         {
            if(!chosen) {
               dist = get_entity_distance(id, mascot)
               if(dist < get_pcvar_num(CVAR_GOALSAFETY))
                  if(id == ballholder) {
                     chosen = id
                     break
                  }
                  else
                     indist[inNum++] = id
            }
         }
      }
   }
   if(!chosen) {
      new rnd = random_num(0, (inNum-1))
      chosen = indist[rnd]
   }
   if(chosen)
      TerminatePlayer(chosen, mascot, team, ( ballholder == chosen ? 230.0 : random_float(5.0, 15.0) ) )
   entity_set_float(mascot,EV_FL_nextthink,halflife_time() + 1.0)
}

goaly_checker(id, Float:gametime, team) {
   if(!is_user_alive(id) || (gametime - GoalyCheckDelay[id] < GOALY_DELAY) )
      return PLUGIN_HANDLED

   new dist, gcheck
   new Float:pOrig[3]
   entity_get_vector(id, EV_VEC_origin, pOrig)
   dist = floatround(get_distance_f(pOrig, TeamBallOrigins[team]))

   //--/* Goaly Exp System */--//
   if(dist < 600 ) {

      gcheck = GoalyCheck[id]

      if(id == ballholder && gcheck >= 2)
         kickBall(id, 1)

      GoalyPoints[id]++

      if(gcheck < 2)
         g_Experience[id] += gcheck * AMOUNT_GOALY
      else
         g_Experience[id] += gcheck * (AMOUNT_GOALY / 2)

      if(gcheck < 5)
         GoalyCheck[id]++

      GoalyCheckDelay[id] = gametime
   }
   else
      GoalyCheck[id] = 0
   return PLUGIN_HANDLED
}

/*====================================================================================================
 [Status Display]

 Purpose:   Displays the Scoreboard information.

 Comment:   $$

====================================================================================================*/
public statusDisplay()
{
   new id, team, bteam = get_user_team(ballholder>0?ballholder:ballowner)
   new score_t = score[T], score_ct = score[CT]

   set_hudmessage(20, 255, 20, 0.95, 0.20, 0, 1.0, 1.5, 0.1, 0.1, HUD_CHANNEL)
   new Float:gametime = get_gametime()

   for(id=1; id<=maxplayers; id++) {
      if(is_user_connected(id) && !is_user_bot(id))
      {
         team = get_user_team(id)
         goaly_checker(id, gametime, team)
         if(!is_user_alive(id) && !is_dead[id] && (team == 1 || team == 2) && GetPlayerModel(id) != 0xFF)
         {
            //new Float:ballorig[3], x
            //entity_get_vector(id,EV_VEC_origin,ballorig)
            //for(x=0;x<3;x++)
            //   distorig[0][x] = floatround(ballorig[x])
            remove_task(id+1000)
            has_knife[id] = false;
            is_dead[id] = true
            new Float:respawntime = CVAR_RESPAWN
            set_task(respawntime,"AutoRespawn",id)
            set_task((respawntime+0.2), "AutoRespawn2",id)
         }
         if(!winner) {
            format(scoreboard,1024,"   %i %L^n%s - %i  |  %s - %i ^n%L %i ^n^n%s^n^n^n%s",get_pcvar_num(CVAR_SCORE),id,"GOALS_WINS",TeamNames[T],score_t,TeamNames[CT],score_ct,id,"EXPERIENCE",g_Experience[id],temp1,team==bteam?temp2:"")
            show_hudmessage(id,"%s",scoreboard)
         }
      }
   }
}

/*====================================================================================================
 [Touched]

 Purpose:   All touching stuff takes place here.

 Comment:   $$

====================================================================================================*/
public touchWorld(ball, world) {

   if(get_speed(ball) > 10)
   {
      new Float:v[3]
      entity_get_vector(ball, EV_VEC_velocity, v)

      v[0] = (v[0] * 0.85)
      v[1] = (v[1] * 0.85)
      v[2] = (v[2] * 0.85)
      entity_set_vector(ball, EV_VEC_velocity, v)
      emit_sound(ball, CHAN_ITEM, BALL_BOUNCE_GROUND, 1.0, ATTN_NORM, 0, PITCH_NORM)
   }

   return PLUGIN_HANDLED
}

public touchPlayer(ball, player) {

   if(is_user_bot(player))
      return PLUGIN_HANDLED

   new playerteam = get_user_team(player)
   if((playerteam != 1 && playerteam != 2))
      return PLUGIN_HANDLED

   remove_task(55555)

   new aname[64], stolen, x
   get_user_name(player,aname,63)
   new ballteam = get_user_team(ballowner)
   if(ballowner > 0 && playerteam != ballteam )
   {
      new speed = get_speed(aball)
      if(speed > 500)
      {
         //configure catching algorithm
         new rnd = random_num(0,100)
         new bstr = (PlayerUpgrades[ballowner][STR] * AMOUNT_STR) / 10
         new dex = (PlayerUpgrades[player][DEX] * AMOUNT_DEX)
         new pct = ( PressedAction[player] ? 40:20 ) + dex

         pct += ( g_sprint[player] ? 5 : 0 )      //player turboing? give 5%
         pct -= ( g_sprint[ballowner] ? 5 : 0 )    //ballowner turboing? lose 5%
         pct -= bstr                  //ballowner has strength? remove bstr

         //will player avoid damage?
         if( rnd > pct ) {
            new Float:dodmg = (float(speed) / 13.0) + bstr

            client_print(0,print_chat,"%L",LANG_PLAYER,"BALL_SMACKED",aname,floatround(dodmg))

            set_msg_block(gmsgDeathMsg,BLOCK_ONCE)
            fakedamage(player,"AssWhoopin",dodmg,1)
            set_msg_block(gmsgDeathMsg,BLOCK_NOT)

            if(!is_user_alive(player)) {
               message_begin(MSG_ALL, gmsgDeathMsg)
               write_byte(ballowner)
               write_byte(player)
               write_string("AssWhoopin")
               message_end()

               new frags = get_user_frags(ballowner)
               entity_set_float(ballowner, EV_FL_frags, float(frags + 1))
               setScoreInfo(ballowner)
               //set_user_frags(ballowner, get_user_frags(ballowner)+1)
               Event_Record(ballowner, KILL, -1, EXP_KILL)

               client_print(player,print_chat,"%L",player,"KILLED_BY_BALL")
               client_print(ballowner,print_chat,"%L",ballowner,"EXP_FOR_BALLKILL")
            }
            else {
               new Float:pushVel[3]
               pushVel[0] = velocity[0]
               pushVel[1] = velocity[1]
               pushVel[2] = velocity[2] + ((velocity[2] < 0)?random_float(-200.0,-50.0):random_float(50.0,200.0))
               entity_set_vector(player,EV_VEC_velocity,pushVel)
            }
            for(x=0;x<3;x++)
               velocity[x] = (velocity[x] * random_float(0.1,0.9))
            entity_set_vector(aball,EV_VEC_velocity,velocity)
            direction = 0
            return PLUGIN_HANDLED
         }
      }

      if(speed > 950)
         play_wav(0, STOLE_BALL_FAST)

      new Float:pOrig[3]
      entity_get_vector(player, EV_VEC_origin, pOrig)
      new dist = floatround(get_distance_f(pOrig, TeamBallOrigins[playerteam]))
      new gainedxp

      if(dist < 550) {
         gainedxp = EXP_STEAL + EXP_GOALY + (speed / 8)
         Event_Record(player, STEAL, -1, EXP_STEAL + EXP_GOALY + (speed / 8))
         GoalyPoints[player] += EXP_GOALY/2
      }
      else {
         gainedxp = EXP_STEAL
         Event_Record(player, STEAL, -1, EXP_STEAL)
      }

      format(temp1,63,"%L",LANG_PLAYER,"STOLE_BALL",TeamNames[playerteam],aname)
      client_print(0,print_console,"%s",temp1)
      stolen = 1

      message_begin(MSG_ONE, gmsgShake, {0,0,0}, player)
      write_short(255 << 12) //ammount
      write_short(1 << 11) //lasts this long
      write_short(255 << 10) //frequency
      message_end()

      client_print(player,print_chat,"%L",player,"EXP_FOR_STEAL",gainedxp)

   }
   if(ballholder == 0) {
      emit_sound(aball, CHAN_ITEM, BALL_PICKED_UP, 1.0, ATTN_NORM, 0, PITCH_NORM)
      new msg[64], check
      if(!has_knife[player])
         give_knife(player)

      if(stolen)
         PowerPlay = 0
      else
         format(temp1,63,"%L",LANG_PLAYER,"BALL_PICKUP",TeamNames[playerteam],aname)

      if(((PowerPlay > 1 && powerplay_list[PowerPlay-2] == player) || (PowerPlay > 0 && powerplay_list[PowerPlay-1] == player)) && PowerPlay != MAX_LVL_POWERPLAY)
         check = true

      if(PowerPlay <= MAX_LVL_POWERPLAY && !check) {
         g_Experience[player] += (PowerPlay==2?10:25)
         powerplay_list[PowerPlay] = player
         PowerPlay++
      }
      curvecount = 0
      direction = 0
      GoalyCheck[player] = 0

      format(temp2, 63, "%L %i",LANG_PLAYER,"POWER_PLAY", PowerPlay>0?PowerPlay-1:0)

      ballholder = player
      ballowner = 0

      if(!g_sprint[player])
         set_speedchange(player)


      set_hudmessage(255, 20, 20, POS_X, 0.4, 1, 1.0, 1.5, 0.1, 0.1, 2)
      format(msg,63,"%L",player,"YOU_HAVE_BALL")
      show_hudmessage(player,"%s",msg)

      //Glow Player who has ball their team color
      beam()
      glow(player, TeamColors[playerteam][0], TeamColors[playerteam][1], TeamColors[playerteam][2], 1)
   }
   return PLUGIN_HANDLED
}

public touchNet(ball, goalpost)
{
   remove_task(55555)

   new team = get_user_team(ballowner)
   new goalent = GoalEnt[team]
   if (goalpost != goalent && ballowner > 0) {
      new aname[64]
      new Float:netOrig[3]
      new netOrig2[3]

      entity_get_vector(ball, EV_VEC_origin,netOrig)
      new l
      for(l=0;l<3;l++)
         netOrig2[l] = floatround(netOrig[l])
      flameWave(netOrig2)
      get_user_name(ballowner,aname,63)
      new frags = get_user_frags(ballowner)
      entity_set_float(ballowner, EV_FL_frags, float(frags + 10))

      play_wav(0, SCORED_GOAL)

      /////////////////////ASSIST CODE HERE///////////

      new assisters[4] = { 0, 0, 0, 0 }
      new iassisters = 0
      new ilastplayer = iassist[ team ]

      // We just need the last player to kick the ball
      // 0 means it has passed 15 at least once
      if ( ilastplayer == 0 )
         ilastplayer = 15
      else
         ilastplayer--

      if ( assist[ ilastplayer ] != 0 ) {
         new i, x, bool:canadd, playerid
         for(i=0; i<16; i++) {
            // Stop if we've already found 4 assisters
            if ( iassisters == MAX_ASSISTERS )
               break
            playerid = assist[ i ]
            // Skip if player is invalid
            if ( playerid == 0 )
               continue
            // Skip if kicker is counted as an assister
            if ( playerid == assist[ ilastplayer ] )
               continue

            canadd = true
            // Loop through each assister value
            for(x=0; x<3; x++)
               // make sure we can add them
               if ( playerid == assisters[ x ] ) {
                  canadd = false
                  break
               }

            // Skip if they've already been added
            if ( canadd == false )
               continue
            // They didn't kick the ball last, and they haven't been added, add them
            assisters[ iassisters++ ] = playerid
         }
         // This gives each person an assist, xp, and prints that out to them
         new c, pass
         for(c=0; c<iassisters; c++) {
            pass = assisters[ c ]
            Event_Record(pass, ASSIST, -1, EXP_ASSIST)
            client_print( pass, print_chat, "%L",pass,"EXP_FOR_ASSIST",EXP_ASSIST)
         }
      }
      iassist[ 0 ] = 0
      /////////////////////ASSIST CODE HERE///////////

      for(l=0; l<3; l++)
         distorig[1][l] = floatround(netOrig[l])
      new distshot = (get_distance(distorig[0],distorig[1])/12)
      new gainedxp = distshot + EXP_GOAL

      format(temp1,63,"%L",LANG_PLAYER,"SCORED_GOAL",TeamNames[team],aname,distshot)
      client_print(0,print_console,"%s",temp1)


      if(distshot > MadeRecord[ballowner][DISTANCE])
         Event_Record(ballowner, DISTANCE, distshot, 0)// record distance, and make that distance exp

      Event_Record(ballowner, GOAL, -1, gainedxp)   //zero xp for goal cause distance is what gives it.

      //Increase Score, and update cvar score
      score[team]++
      switch(team) {
         case 1: set_cvar_num("score_ct",score[team])
         case 2: set_cvar_num("score_t",score[team])
      }
      client_print(ballowner,print_chat,"%L",ballowner,"EXP_FOR_GOAL",gainedxp,distshot)

      new oteam = (team == 1 ? 2 : 1)
      increaseTeamXP(team, 75)
      increaseTeamXP(oteam, 50)
      moveBall(0)

      new x
      for(x=1; x<=maxplayers; x++) {
         if(is_user_connected(x))
         {
            Event_Record(x, GOALY, GoalyPoints[x], 0)
            new kills = get_user_frags(x)
            new deaths = cs_get_user_deaths(x)
            setScoreInfo(x)
            if( deaths > 0)
               PlayerDeaths[x] = deaths
            if( kills > 0)
               PlayerKills[x] = kills
         }
      }

      if(score[team] < get_pcvar_num(CVAR_SCORE)) {
         new r = random_num(0,MAX_SOUNDS-1)
         play_wav(0, SCORED_SOUNDS[r]);

      }
      else {
         winner = team
         format(scoreboard,1024,"%L",LANG_PLAYER,"TEAM_WINS",TeamNames[team])
         set_task(1.0,"showhud_winner",0,"",0,"a",3)
      }

      server_cmd("sv_restart 4")

   }
   else if(goalpost == goalent) {
      moveBall(0, team)
      client_print(ballowner,print_chat,"%L",ballowner,"CANNOT_KICK_GOAL")
   }
   return PLUGIN_HANDLED
}

//This is for soccerjam.bsp to fix locker room.
public touchBlocker(pwnball, blocker) {
   new Float:orig[3] = { 2234.0, 1614.0, 1604.0 }
   entity_set_origin(pwnball, orig)
}

/*====================================================================================================
 [Events]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
//public Event_DeathMsg() {
//   new id = read_data(2)
//   strip_user_weapons(id);
//}

public Event_Damage()
{
   new victim = read_data(0)
   new attacker = get_user_attacker(victim)
   if(is_user_alive(attacker)) {
      if(is_user_alive(victim) ) {

         #if !defined KNIFE_DISARM_ON
         if(victim == ballholder) {
         #endif
            new upgrade = PlayerUpgrades[attacker][DISARM]
            if(upgrade) {
               new disarm = upgrade * AMOUNT_DISARM
               new disarmpct = BASE_DISARM + (victim==ballholder?(disarm*2):0)
               new rand = random_num(1,100)

               if(disarmpct >= rand)
               {
                  new vname[32], aname[32]
                  get_user_name(victim,vname,31)
                  get_user_name(attacker,aname,31)

                  #if defined KNIFE_DISARM_ON
                  if(victim == ballholder) {
                  #endif
                     kickBall(victim, 1)
                     client_print(attacker,print_chat,"%L",attacker,"DISARM_BALL_ATTACKER",vname)
                     client_print(victim,print_chat,"%L",victim,"DISARM_BALL_VICTIM",aname)
                  #if defined KNIFE_DISARM_ON
                  }
                  else {
                     new weapon, clip, ammo
                     weapon = get_user_weapon(victim,clip,ammo)
                     if(weapon == CSW_KNIFE)
                     {
                        strip_user_weapons(victim);
                        has_knife[victim] = false;
                        set_task(float(disarm / DISARM_MULTIPLIER), "give_knife", victim+1000)
                        client_print(attacker,print_chat,"%L",attacker,"DISARM_KNIFE_ATTACKER",vname)
                        client_print(victim,print_chat,"%L",victim,"DISARM_KNIFE_VICTIM",aname)
                     }
                  }
                  #endif
               }
            }
         #if !defined KNIFE_DISARM_ON
         }
         #endif
      }
      else
         g_Experience[attacker] += (EXP_KILL/2)
   }
}

public Event_StartRound()
{
   g_TimeLimit = get_cvar_num("mp_timelimit");
   if(winner)
   {
      set_task(1.0,"displayWinnerAwards",0)

      //MP_TIMELIMIT replication
      new Float:gtime = float(g_TimeLimit) - (get_gametime() / 60.0);

      if( g_TimeLimit && gtime <= 0.0 )
      {
         //Fix for Map Vote plugins (2 min marker).
         new bool:check;
         if(cvar_exists("amx_extendmap_max"))
            check = true;

         server_cmd("mp_timelimit %i", (check ? 2 : 1));
         set_task(10.0, "CheckExtendMap", 555666, "", 0, "b");
      }
      else
         set_task(10.0,"PostGame",0)
   }
   else
      SetupRound()
}

public CheckExtendMap() {

   new timelimit = get_cvar_num("mp_timelimit");
   if(timelimit > g_TimeLimit) {
      PostGame();
      remove_task(555666);
   }
}

public SetupRound() {

   iassist[ 0 ] = 0

   if(!is_valid_ent(aball))
      createball()

   moveBall(1)

   new id
   for(id=1; id<=maxplayers; id++) {
      if(is_user_connected(id) && !is_user_bot(id)) {
         is_dead[id] = false
         seconds[id] = 0
         g_sprint[id] = 0
         PressedAction[id] = 0
      }
   }
   play_wav(0, ROUND_START)

   set_task(0.5, "PostSetupRound", 0)
   set_task(1.0, "PostPostSetupRound", 0)

   return PLUGIN_HANDLED
}

public PostSetupRound() {
   new id
   for(id=1; id<=maxplayers; id++)
      if(is_user_alive(id) && !is_user_bot(id))
         give_knife(id)
}

public PostPostSetupRound() {
   new id, kills, deaths
   for(id=1; id<=maxplayers; id++) {
      if(is_user_connected(id) && !is_user_bot(id)) {
         kills = PlayerKills[id]
         deaths = PlayerDeaths[id]
         if(kills)
            entity_set_float(id, EV_FL_frags, float(kills))
         if(deaths)
            cs_set_user_deaths(id,deaths)

         setScoreInfo(id)
      }
   }
}

public Event_ResetHud(id) {
   goaldied[id] = 0
   set_task(1.0,"PostResetHud",id)
}

public PostResetHud(id) {
   if(is_user_alive(id) && !is_user_bot(id))
   {
      new stam = PlayerUpgrades[id][STA]

      if(!has_knife[id]) {
         give_knife(id)
      }

      //compensate for our turbo
      if(!g_sprint[id])
         set_speedchange(id)

      if(stam > 0)
         entity_set_float(id, EV_FL_health, float(BASE_HP + (stam * AMOUNT_STA)))
   }
}

/*====================================================================================================
 [Client Commands]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
public Turbo(id)
{
   if(is_user_alive(id))
      g_sprint[id] = 1
   return PLUGIN_HANDLED
}

public client_PreThink(id)
{
   if( is_kickball && is_valid_ent(aball) && is_user_connected(id))
   {
      new button = entity_get_int(id, EV_INT_button)
      new usekey = (button & IN_USE)

      new up = (button & IN_FORWARD)
      new down = (button & IN_BACK)
      new moveright = (button & IN_MOVERIGHT)
      new moveleft = (button & IN_MOVELEFT)
      new jump = (button & IN_JUMP)
      new flags = entity_get_int(id, EV_INT_flags)
      new onground = flags & FL_ONGROUND
      if( (moveright || moveleft) && !up && !down && jump && onground && !g_sprint[id] && id != ballholder)
         SideJump[id] = 1

      if(g_sprint[id])
         entity_set_float(id, EV_FL_fuser2, 0.0)

      if( id != ballholder )
         PressedAction[id] = usekey
      else {
         if( usekey && !PressedAction[id]) {
            kickBall(ballholder, 0)
         }
         else if( !usekey && PressedAction[id])
            PressedAction[id] = 0
      }
   }
}

public client_PostThink(id) {
   if(is_kickball && is_user_connected(id)) {
      new Float:gametime = get_gametime()
      new button = entity_get_int(id, EV_INT_button)

      new up = (button & IN_FORWARD)
      new down = (button & IN_BACK)
      new moveright = (button & IN_MOVERIGHT)
      new moveleft = (button & IN_MOVELEFT)
      new jump = (button & IN_JUMP)
      new Float:vel[3]

      entity_get_vector(id,EV_VEC_velocity,vel)

      if( (gametime - SideJumpDelay[id] > 5.0) && SideJump[id] && jump && (moveright || moveleft) && !up && !down) {

         vel[0] *= 2.0
         vel[1] *= 2.0
         vel[2] = 300.0

         entity_set_vector(id,EV_VEC_velocity,vel)
         SideJump[id] = 0
         SideJumpDelay[id] = gametime
      }
      else
         SideJump[id] = 0
   }
}

public kickBall(id, velType)
{
   remove_task(55555)
   set_task(get_pcvar_float(CVAR_RESET),"clearBall",55555)

   new team = get_user_team(id)
   new a,x

   //Give it some lift
   ball_infront(id, 55.0)

   testorigin[2] += 10

   new Float:tempO[3], Float:returned[3]
   new Float:dist2

   entity_get_vector(id, EV_VEC_origin, tempO)
   new tempEnt = trace_line( id, tempO, testorigin, returned )

   dist2 = get_distance_f(testorigin, returned)

   //ball_infront(id, 55.0)

   if( point_contents(testorigin) != CONTENTS_EMPTY || (!is_user_connected(tempEnt) && dist2 ) )//|| tempDist < 65)
      return PLUGIN_HANDLED
   else
   {
      //Check Make sure our ball isnt inside a wall before kicking
      new Float:ballF[3], Float:ballR[3], Float:ballL[3]
      new Float:ballB[3], Float:ballTR[3], Float:ballTL[3]
      new Float:ballBL[3], Float:ballBR[3]

      for(x=0; x<3; x++) {
            ballF[x] = testorigin[x];   ballR[x] = testorigin[x];
            ballL[x] = testorigin[x];   ballB[x] = testorigin[x];
            ballTR[x] = testorigin[x];   ballTL[x] = testorigin[x];
            ballBL[x] = testorigin[x];   ballBR[x] = testorigin[x];
         }

      for(a=1; a<=6; a++) {

         ballF[1] += 3.0;   ballB[1] -= 3.0;
         ballR[0] += 3.0;   ballL[0] -= 3.0;

         ballTL[0] -= 3.0;   ballTL[1] += 3.0;
         ballTR[0] += 3.0;   ballTR[1] += 3.0;
         ballBL[0] -= 3.0;   ballBL[1] -= 3.0;
         ballBR[0] += 3.0;   ballBR[1] -= 3.0;

         if(point_contents(ballF) != CONTENTS_EMPTY || point_contents(ballR) != CONTENTS_EMPTY ||
         point_contents(ballL) != CONTENTS_EMPTY || point_contents(ballB) != CONTENTS_EMPTY ||
         point_contents(ballTR) != CONTENTS_EMPTY || point_contents(ballTL) != CONTENTS_EMPTY ||
         point_contents(ballBL) != CONTENTS_EMPTY || point_contents(ballBR) != CONTENTS_EMPTY)
               return PLUGIN_HANDLED
      }

      new ent = -1
      testorigin[2] += 35.0

      while((ent = find_ent_in_sphere(ent, testorigin, 35.0)) != 0) {
         if(ent > maxplayers)
         {
            new classname[32]
            entity_get_string(ent, EV_SZ_classname, classname, 31)

            if((contain(classname, "goalnet") != -1 || contain(classname, "func_") != -1) &&
               !equal(classname, "func_water") && !equal(classname, "func_illusionary"))
               return PLUGIN_HANDLED
         }
      }
      testorigin[2] -= 35.0

   }

   new kickVel
   if(!velType)
   {
      new str = (PlayerUpgrades[id][STR] * AMOUNT_STR) + (AMOUNT_POWERPLAY*(PowerPlay*5))
      kickVel = get_pcvar_num(CVAR_KICK) + str
      kickVel += g_sprint[id] * 100

      if(direction) {
         entity_get_vector(id, EV_VEC_angles, BallSpinDirection)
         curvecount = CURVE_COUNT
      }
   }
   else {
      curvecount = 0
      direction = 0
      kickVel = random_num(100, 600)
   }

   new Float:ballorig[3]
   entity_get_vector(id,EV_VEC_origin,ballorig)
   for(x=0; x<3; x++)
      distorig[0][x] = floatround(ballorig[x])

   velocity_by_aim(id, kickVel, velocity)

   for(x=0; x<3; x++)
      distorig[0][x] = floatround(ballorig[x])

   /////////////////////WRITE ASSIST CODE HERE IF NEEDED///////////
   if ( iassist[ 0 ] == team ) {
      if ( iassist[ team ] == 15 )
         iassist[ team ] = 0
   }
   else {
      // clear the assist list
      new ind
      for(ind = 0; ind < 16; ind++ )
         assist[ ind ] = 0
      // clear the assist index
      iassist[ team ] = 0
      // set which team to track
      iassist[ 0 ] = team
   }
   assist[ iassist[ team ]++ ] = id
   /////////////////////WRITE ASSIST CODE HERE IF NEEDED///////////

   ballowner = id
   ballholder = 0
   entity_set_origin(aball,testorigin)
   entity_set_vector(aball,EV_VEC_velocity,velocity)

   set_task(CURVE_TIME*2, "CurveBall", id)

   emit_sound(aball, CHAN_ITEM, BALL_KICKED, 1.0, ATTN_NORM, 0, PITCH_NORM)

   glow(id,0,0,0,0)

   beam()

   new aname[64]
   get_user_name(id,aname,63)

   if(!g_sprint[id])
      set_speedchange(id)

   format(temp1,63,"%L",LANG_PLAYER,"KICKED_BALL",TeamNames[team],aname)
   client_print(0,print_console,"%s",temp1)
   return PLUGIN_HANDLED
}

/*====================================================================================================
 [Command Blocks]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
public client_kill(id) {
   if(is_kickball)
      return PLUGIN_HANDLED
   return PLUGIN_CONTINUE
}

public client_command(id) {
   if(!is_kickball) return PLUGIN_CONTINUE
   new arg[13]
   read_argv( 0, arg , 12 )

   if ( equal("buy",arg) || equal("autobuy",arg) )
      return PLUGIN_HANDLED

   return PLUGIN_CONTINUE
}

//fix for an exploit.
public menuclass(id) {
   
   // They changed teams
   SetPlayerModel(id, 0xFF);
}

GetPlayerModel(id)
{
   if(!is_user_connected(id))
      return 0;

   return get_pdata_int(id, OFFSET_INTERNALMODEL, 5);
}

SetPlayerModel(id, int)
{
   if(!is_user_connected(id))
      return;

   set_pdata_int(id, OFFSET_INTERNALMODEL, int, 5);
}

public team_select(id, key) {
   if(is_kickball) {
      new team = get_user_team(id)
      //SetPlayerModel(id, 0xFF);
      if( (team == 1 || team == 2) && (key == team-1) )
      {
         new message[64]
         format(message, 63, "%L",id,"CANT_REJOIN_TEAM")

         message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("StatusText"), {0, 0, 0}, id)
         write_byte(0)
         write_string(message)
         message_end()

         engclient_cmd(id,"chooseteam")

         return PLUGIN_HANDLED
      }
   }
   return PLUGIN_CONTINUE
}

public fullupdate(id)
   return PLUGIN_HANDLED

/*====================================================================================================
 [Upgrades]

 Purpose:   This handles the upgrade menu.

 Comment:   $$

====================================================================================================*/
public BuyUpgrade(id) {

   new level[65], num[11], mTitle[101]//, max_count
   format(mTitle,100,"%L",id,"MENU_TITLE")

   menu_upgrade[id] = menu_create(mTitle, "Upgrade_Handler")
   new x
   for(x=1; x<=UPGRADES; x++)
   {
      new price = ((PlayerUpgrades[id][x] * UpgradePrice[x]) / 2) + UpgradePrice[x]
      if((PlayerUpgrades[id][x] + 1) > UpgradeMax[x]) {
         //max_count++
         format(level,64,"\r%s %L",UpgradeTitles[x],id,"MENU_CHOICE_MAXED",UpgradeMax[x])
      }
      else {
         format(level,64,"%s \r%L \y-- \w%i XP",UpgradeTitles[x], id, "MENU_CHOICE_NEXT", PlayerUpgrades[id][x]+1, price)
      }
      format(num, 10,"%i",x)
      menu_additem(menu_upgrade[id], level, num, 0)
   }

   menu_addblank(menu_upgrade[id], (UPGRADES+1))
   menu_setprop(menu_upgrade[id], MPROP_EXIT, MEXIT_NORMAL)

   menu_display(id, menu_upgrade[id], 0)
   return PLUGIN_HANDLED
}

public Upgrade_Handler(id, menu, item) {

   if(item == MENU_EXIT)
      return PLUGIN_HANDLED

   new cmd[6], iName[64]
   new access, callback
   menu_item_getinfo(menu, item, access, cmd,5, iName, 63, callback)

   new upgrade = str_to_num(cmd)

   new playerupgrade = PlayerUpgrades[id][upgrade]
   new price = ((playerupgrade * UpgradePrice[upgrade]) / 2) + UpgradePrice[upgrade]
   new maxupgrade = UpgradeMax[upgrade]

   if(playerupgrade != maxupgrade && playerupgrade != maxupgrade+MAX_LVL_BONUS)
   {
      new needed = g_Experience[id] - price

      if( (needed >= 0) )
      {
         if(playerupgrade < maxupgrade-1)
            playerupgrade += 1
         else
            playerupgrade += MAX_LVL_BONUS+1

         g_Experience[id] -= price

         if(playerupgrade < maxupgrade)
            client_print(id,print_chat,"%L",id,"MENU_UPGRADED",playerupgrade,UpgradeTitles[upgrade],price)
         else {
            client_print(id,print_chat,"%L",id,"MENU_UPGRADED",maxupgrade,UpgradeTitles[upgrade],price)
            #if(MAX_LVL_BONUS > 1)
               client_print(id,print_chat,"%L",id,"MENU_MAX_LVL_BONUS",maxupgrade,MAX_LVL_BONUS)
            #else
               client_print(id,print_chat,"%L",id,"MENU_MAX_LVL",maxupgrade)
            #endif

            play_wav(id, UPGRADED_MAX_LEVEL)
         }
         switch(upgrade) {
            case STA: {
               new stam = playerupgrade * AMOUNT_STA
               entity_set_float(id, EV_FL_health, float(BASE_HP + stam))
            }
            case AGI: {
               if(!g_sprint[id])
                  set_speedchange(id)
            }
         }
         PlayerUpgrades[id][upgrade] = playerupgrade
      }
      else
         client_print(id,print_chat,"%L",id,"MENU_MISSING_EXP",(needed * -1),(playerupgrade+1),UpgradeTitles[upgrade])
   }
   else {
      client_print(id,print_chat,"%L",id,"MENU_UPGRADE_MAXED",UpgradeTitles[upgrade],maxupgrade)
   }
   return PLUGIN_HANDLED
}

/*====================================================================================================
 [Meters]

 Purpose:   This controls the turbo meter and curve angle meter.

 Comment:   $$

====================================================================================================*/
public meter()
{
   new id
   new turboTitle[32]
   new sprintText[128], sec
   new r, g, b, team
   new len, x
   new ndir = -(DIRECTIONS)
   format(turboTitle,31,"%L",LANG_PLAYER,"TURBO_TITLE");
   for(id=1; id<=maxplayers; id++)
   {
      if(!is_user_connected(id) || !is_user_alive(id) || is_user_bot(id))
         continue

      sec = seconds[id]
      team = get_user_team(id)
      r = TeamMeterColors[team][0]
      g = TeamMeterColors[team][1]
      b = TeamMeterColors[team][2]

      if(id == ballholder) {

         set_hudmessage(r, g, b, POS_X, 0.75, 0, 0.0, 0.6, 0.0, 0.0, 1)

         len = format(sprintText, 127, "  %L ^n[",id,"CURVE_TITLE")

         for(x=DIRECTIONS; x>=ndir; x--)
            if(x==0)
               len += format(sprintText[len], 127-len, "%s%s",direction==x?"0":"+", x==ndir?"]":"  ")
            else
               len += format(sprintText[len], 127-len, "%s%s",direction==x?"0":"=", x==ndir?"]":"  ")

         show_hudmessage(id, "%s", sprintText)
      }

      set_hudmessage(r, g, b, POS_X, POS_Y, 0, 0.0, 0.6, 0.0, 0.0, 3)

      if(sec > 30) {
         sec -= 2
         format(sprintText, 127, "  %s ^n[==============]",turboTitle)
         set_speedchange(id)
         g_sprint[id] = 0
      }
      else if(sec >= 0 && sec < 30 && g_sprint[id]) {
         sec += 2
         set_speedchange(id, 100.0)
      }

      switch(sec)   {
         case 0:      format(sprintText, 127, "  %s ^n[||||||||||||||]",turboTitle)
         case 2:      format(sprintText, 127, "  %s ^n[|||||||||||||=]",turboTitle)
         case 4:      format(sprintText, 127, "  %s ^n[||||||||||||==]",turboTitle)
         case 6:      format(sprintText, 127, "  %s ^n[|||||||||||===]",turboTitle)
         case 8:      format(sprintText, 127, "  %s ^n[||||||||||====]",turboTitle)
         case 10:   format(sprintText, 127, "  %s ^n[|||||||||=====]",turboTitle)
         case 12:   format(sprintText, 127, "  %s ^n[||||||||======]",turboTitle)
         case 14:   format(sprintText, 127, "  %s ^n[|||||||=======]",turboTitle)
         case 16:   format(sprintText, 127, "  %s ^n[||||||========]",turboTitle)
         case 18:   format(sprintText, 127, "  %s ^n[|||||=========]",turboTitle)
         case 20:   format(sprintText, 127, "  %s ^n[||||==========]",turboTitle)
         case 22:   format(sprintText, 127, "  %s ^n[|||===========]",turboTitle)
         case 24:   format(sprintText, 127, "  %s ^n[||============]",turboTitle)
         case 26:   format(sprintText, 127, "  %s ^n[|=============]",turboTitle)
         case 28:   format(sprintText, 127, "  %s ^n[==============]",turboTitle)
         case 30: {
            format(sprintText, 128, "  %s ^n[==============]",turboTitle)
            sec = 92
         }
         case 32: sec = 0
      }

       seconds[id] = sec
      show_hudmessage(id,"%s",sprintText)
   }
}

/*====================================================================================================
 [Misc.]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
set_speedchange(id, Float:speed=0.0)
{
   new Float:agi = float( (PlayerUpgrades[id][AGI] * AMOUNT_AGI) + (id==ballholder?(AMOUNT_POWERPLAY * (PowerPlay*2)):0) )
   agi += (BASE_SPEED + speed)
   entity_set_float(id,EV_FL_maxspeed, agi)
}

public give_knife(id) {
   if(id > 1000)
      id -= 1000

   remove_task(id+1000)

   give_item(id, "weapon_knife")
   has_knife[id] = true;
}

Event_Record(id, recordtype, amt, exp) {
   if(amt == -1)
      MadeRecord[id][recordtype]++
   else
      MadeRecord[id][recordtype] = amt

   new playerRecord = MadeRecord[id][recordtype]
   if(playerRecord > TopPlayer[1][recordtype])
   {
      TopPlayer[0][recordtype] = id
      TopPlayer[1][recordtype] = playerRecord
      new name[MAX_NAME_LENGTH+1]
      get_user_name(id,name,MAX_NAME_LENGTH)
      format(TopPlayerName[recordtype],MAX_NAME_LENGTH,"%s",name)
   }
   g_Experience[id] += exp
}

Float:normalize(Float:nVel)
{
   if(nVel > 360.0) {
      nVel -= 360.0
   }
   else if(nVel < 0.0) {
      nVel += 360.0
   }

   return nVel
}

print_message(id, msg[]) {
   message_begin(MSG_ONE_UNRELIABLE, gmsgSayText, {0,0,0}, id)
   write_byte(id)
   write_string(msg)
   message_end()
}

public editTextMsg()
{
   new string[64], radio[64]
   get_msg_arg_string(2, string, 63)

   if( get_msg_args() > 2 )
      get_msg_arg_string(3, radio, 63)

   if(containi(string, "#Game_will_restart") != -1 || containi(radio, "#Game_radio") != -1)
      return PLUGIN_HANDLED

   return PLUGIN_CONTINUE
}

public client_connect(id)
   if(is_kickball)
      set_user_info(id,"_vgui_menus","0")

public AutoRespawn(id)
   if(is_dead[id] && is_user_connected(id)) {
      new team = get_user_team(id)
      if(team == 1 || team == 2) {
         spawn(id)

      }
      else
         is_dead[id] = false
   }

public AutoRespawn2(id)
   if(is_dead[id] && is_user_connected(id)) {
      new team = get_user_team(id)
      if(team == 1 || team == 2) {
         spawn(id)
         if(!has_knife[id])
            give_knife(id)
      }
      //strip_user_weapons(id)
      is_dead[id] = false
   }

play_wav(id, wav[])
   client_cmd(id,"spk %s",wav)

cmdSpectate(id) {
   cs_set_user_team(id, CS_TEAM_SPECTATOR, CS_DONTCHANGE)
   if(is_user_alive(id))
      user_kill(id)
}

increaseTeamXP(team, amt) {
   new id
   for(id=1; id<=maxplayers; id++)
      if(get_user_team(id) == team && is_user_connected(id))
         g_Experience[id] += amt
}

setScoreInfo(id) {
   message_begin(MSG_BROADCAST,get_user_msgid("ScoreInfo"));
   write_byte(id);
   write_short(get_user_frags(id));
   write_short(cs_get_user_deaths(id));
   write_short(0);
   write_short(get_user_team(id));
   message_end();
}

// Erase our current temps (used for ball events)
public eraser(num) {
   if(num == 3333)
      format(temp1,63,"")
   if(num == 4444)
      format(temp2,63,"")
   return PLUGIN_HANDLED
}
/*====================================================================================================
 [Cleanup]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
public client_disconnect(id) {
   if(is_kickball) {
      new x
      for(x = 1; x<=RECORDS; x++)
         MadeRecord[id][x] = 0
      remove_task(id)
      if(ballholder == id ) {
         ballholder = 0
         clearBall()
      }
      if(ballowner == id) {
         ballowner = 0
      }

      GoalyPoints[id] = 0
      PlayerKills[id] = 0
      PlayerDeaths[id] = 0
      is_dead[id] = false
      seconds[id] = 0
      g_sprint[id] = 0
      PressedAction[id] = 0
      has_knife[id] = false;
      g_Experience[id] = 0

      for(x=1; x<=UPGRADES; x++)
         PlayerUpgrades[id][x] = 0
   }
}

cleanup() {
   new x, id, m
   for(x=1;x<=RECORDS;x++) {
      TopPlayer[0][x] = 0
      TopPlayer[1][x] = 0
      TopPlayerName[x][0] = 0
   }

   for(id=1;id<=maxplayers;id++) {
      PlayerDeaths[id] = 0
      PlayerKills[id] = 0

      //UsedExp[id] = 0
      g_Experience[id] = 0

      for(x=1;x<=UPGRADES;x++)
         PlayerUpgrades[id][x] = 0

      for(m = 1; m<=RECORDS; m++)
         MadeRecord[id][m] = 0
   }

   PowerPlay = 0
   winner = 0
   score[T] = 0
   score[CT] = 0
   set_cvar_num("score_ct",0)
   set_cvar_num("score_t",0)

   for(x = 0;x<=cntCT;x++)
      ct[x] = 0

   for(x = 0; x<= cntT; x++)
      terr[x] = 0

   cntCT = 0
   cntT = 0
}

/*====================================================================================================
 [Help]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
public client_putinserver(id) {
   if(is_kickball) {
      set_task(20.0,"soccerjamHelp",id)
   }
}

public soccerjamHelp(id)
{
   client_cmd(id, "cl_forwardspeed 1000")
   client_cmd(id, "cl_backspeed 1000")
   client_cmd(id, "cl_sidespeed 1000")

   new name[32]
   get_user_name(id,name,31)
   client_print(id,print_chat,"========= - [Soccer Jam] v%s - ========",VERSION)
   client_print(id,print_chat,"%L",id,"WELCOME_MSG",name)
   client_print(id,print_chat,"%L",id,"WELCOME_HELP_MSG")
   LateJoinExp(id)
   client_print(id,print_chat,"=========------------------========")
}

LateJoinExp(id)
{
   new total = (score[T] + score[CT]) * AMOUNT_LATEJOINEXP
   if(total) {
      g_Experience[id] += total
      client_print(id, print_chat, "%L",id,"EXP_FOR_LATEJOIN",total)
   }
}

public handle_say(id)
{
   new said[192], help[7]
   read_args(said,192)
   remove_quotes(said)
   strcat(help,said,6)
   if( (containi(help, "help") != -1) )
      soccerjam_help(id)
   if( (contain(help, "spec") != -1) )
      cmdSpectate(id)

   return PLUGIN_CONTINUE

}

public soccerjam_help(id) {
   new help_title[64], msg[2047], len
   format(help_title,63,"%L",id,"HELP_HEADER")
   len = format(msg,2046,"<body bgcolor=#000000><font color=#FFB000><br>")
   len += format(msg[len],2046-len,"<center><h2>%L</h2><br><table><tr><td><p><b><font color=#FFB000>",id,"HELP_TITLE")
   len += format(msg[len],2046-len,"<h2>%L</h2>",id,"HELP_MOVES_TITLE")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_KICK")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_CURVELEFT")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_CURVERIGHT")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_TURBO")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_UPGRADE")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_DIVE")
   len += format(msg[len],2046-len,"%L<br><br>",id,"HELP_MOVES_CATCH")

   len += format(msg[len],2046-len,"<h2>%L</h2>",id,"HELP_STATS_TITLE")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_STATS_STAMINA")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_STATS_STRENGTH")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_STATS_AGILITY")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_STATS_DEXTERITY")
   len += format(msg[len],2046-len,"%L<br>",id,"HELP_STATS_DISARM")
   len += format(msg[len],2046-len,"<h2>%L</h2>",id,"HELP_POWERPLAY_TITLE")
   len += format(msg[len],2046-len,"- %L<br>",id,"HELP_POWERPLAY_ONE")
   len += format(msg[len],2046-len,"- %L<br>",id,"HELP_POWERPLAY_TWO")
   len += format(msg[len],2046-len,"<h2>%L</h2>",id,"HELP_TIPS_TITLE")
   len += format(msg[len],2046-len,"- %L<br>",id,"HELP_TIPS_ONE")
   len += format(msg[len],2046-len,"- %L<br>",id,"HELP_TIPS_TWO")
   len += format(msg[len],2046-len,"- %L<br>",id,"HELP_TIPS_THREE")
   len += format(msg[len],2046-len,"</b><br></td></tr></table><br>Soccer Jam made by OneEyed</center>")
   show_motd(id,msg,help_title)
}

/*====================================================================================================
 [Post Game]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
public showhud_winner() {
   set_hudmessage(255, 0, 20, -1.0, 0.35, 1, 1.0, 1.5, 0.1, 0.1, HUD_CHANNEL)
   show_hudmessage(0,"%s",scoreboard)
}
public displayWinnerAwards()
{
   //If NO steal/assist was made, set name to Nobody
   new x
   for(x=1;x<=RECORDS;x++)
      if(!TopPlayer[0][x])
         format(TopPlayerName[x],MAX_NAME_LENGTH,"Nobody")

   //Display our Winning Team, with Awards, and kill Comm Chair of opponent
   new awards[513]
   new len = 0
   len += format(awards[len], 512-len, "%s %L^n", (winner == 1 ? "Terrorist" : "CT"), LANG_PLAYER, "AWARDS_HEADER" )
   len += format(awards[len], 512-len, "%s - %i  |  %s - %i^n^n", TeamNames[T],score[T],TeamNames[CT],score[CT])
   len += format(awards[len], 512-len, "      %L^n",LANG_PLAYER,"AWARDS_TITLE")
   len += format(awards[len], 512-len, "%i %L -- %s^n", TopPlayer[1][GOAL], LANG_PLAYER, "AWARDS_GOALS", TopPlayerName[GOAL])
   len += format(awards[len], 512-len, "%i %L -- %s^n", TopPlayer[1][STEAL], LANG_PLAYER, "AWARDS_STEALS", TopPlayerName[STEAL])
   len += format(awards[len], 512-len, "%i %L -- %s^n", TopPlayer[1][ASSIST], LANG_PLAYER, "AWARDS_ASSISTS", TopPlayerName[ASSIST])
   len += format(awards[len], 512-len, "%i %L -- %s^n", TopPlayer[1][KILL], LANG_PLAYER, "AWARDS_BALLKILLS", TopPlayerName[KILL])
   len += format(awards[len], 512-len, "%i %L -- %s^n", TopPlayer[1][DISTANCE], LANG_PLAYER, "AWARDS_LONGESTGOAL", TopPlayerName[DISTANCE])

   set_hudmessage(250, 130, 20, 0.4, 0.35, 0, 1.0, 10.0, 0.1, 0.1, 2)
   show_hudmessage(0, "%s", awards)
}

public PostGame() {
   new randomize = get_pcvar_num(CVAR_RANDOM)
   if(randomize)
   {
      set_hudmessage(20, 250, 20, -1.0, 0.55, 1, 1.0, 3.0, 1.0, 0.5, 2)
      show_hudmessage(0, "%L",LANG_PLAYER,"RANDOMIZING_TEAMS")
      set_task(3.0,"randomize_teams",0)
   }
   else
      BeginCountdown()
}

public BeginCountdown() {
   if(!timer) {
      timer = COUNTDOWN_TIME
      cleanup()
   }
   else {
      new output[32]
      num_to_word(timer,output,31)
      client_cmd(0,"spk vox/%s.wav",output)

      if(timer > (COUNTDOWN_TIME / 2))
         set_hudmessage(20, 250, 20, -1.0, 0.55, 1, 1.0, 1.0, 1.0, 0.5, 2)
      else
         set_hudmessage(255, 0, 0, -1.0, 0.55, 1, 1.0, 1.0, 1.0, 0.5, 2)

      if(timer > (COUNTDOWN_TIME - 2))
         show_hudmessage(0, "%L^n%i",LANG_PLAYER,"GAME_BEGINS_IN",timer)
      else
         show_hudmessage(0, "%i",timer)

      if(timer == 1)
         server_cmd("sv_restart 1")
      timer--
      set_task(0.9,"BeginCountdown",0)
   }
}

/*====================================================================================================
 [Team Randomizer]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
public randomize_teams()
{
   new terr, ct, id, team, cnt, temp, x, pl_temp
   new teams[3][33], player_list[33]
   new shuff_t, shuff_ct
   new shuffle = random_num(10,30)

   //Put all players in one big list
   for(id=1; id<=maxplayers; id++)
      if(is_user_connected(id) && !is_user_bot(id)) {
         team = get_user_team(id)
         if(team == 1 || team == 2)
            player_list[cnt++] = id
      }

   cnt--

   //Make a list of Terr and CT players
   while(cnt >= 0)
   {
      if(cnt % 2 == 0)
         teams[1][terr++] = player_list[cnt--]
      else
         teams[2][ct++] = player_list[cnt--]
   }

   //Shuffle the players
   for(x=0;x<=shuffle;x++) {
      shuff_t = random_num(0,terr-1);
      shuff_ct = random_num(0,ct-1);
      temp = teams[1][shuff_t];
      teams[1][shuff_t] = teams[2][shuff_ct];
      teams[2][shuff_ct] = temp;
   }

   //Put Players in their team.
   for(x=1; x<3; x++)
      for(id=0; id<((terr>ct?terr:ct)); id++) {
         pl_temp = teams[x][id]
         if(is_user_connected(pl_temp)) {
            select_model(pl_temp, x, random_num(1,4))
            set_task(1.0, "DelayedTeamSwitch", pl_temp+(x*1000))
         }
      }
   set_task(3.0,"BeginCountdown",0)
}

public DelayedTeamSwitch(id) {
   new team, msg[124]
   if(id >= 2000)
      team = 2
   else
      team = 1

   id -= team*1000

   format(msg, 123, "^x03 %L",id,"RANDOM_MOVED_TEAM", team==1?"Terrorist":"Counter-Terrorist")
   print_message(id, msg)
}

//random model selecting for teamstack
select_model(id, team, model) {
   switch(team) {
      case 1: {
         switch(model) {
            case 1: cs_set_user_team(id, CS_TEAM_T, CS_T_TERROR)
            case 2: cs_set_user_team(id, CS_TEAM_T, CS_T_LEET)
            case 3:   cs_set_user_team(id, CS_TEAM_T, CS_T_ARCTIC)
            case 4: cs_set_user_team(id, CS_TEAM_T, CS_T_GUERILLA)
         }
      }
      case 2: {
         switch(model) {
            case 1: cs_set_user_team(id, CS_TEAM_CT, CS_CT_URBAN)
            case 2: cs_set_user_team(id, CS_TEAM_CT, CS_CT_GSG9)
            case 3: cs_set_user_team(id, CS_TEAM_CT, CS_CT_SAS)
            case 4: cs_set_user_team(id, CS_TEAM_CT, CS_CT_GIGN)
            case 5: cs_set_user_team(id, CS_TEAM_CT, CS_CT_VIP) //my lil secret
         }
      }
      case 3: {
         cs_set_user_team(id, CS_TEAM_SPECTATOR, CS_DONTCHANGE)
         if(is_user_alive(id))
            user_kill(id)
      }
   }
}

/*====================================================================================================
 [Special FX]

 Purpose:   $$

 Comment:   $$

====================================================================================================*/
TerminatePlayer(id, mascot, team, Float:dmg) {
   new orig[3], Float:morig[3], iMOrig[3]

   get_user_origin(id, orig)
   entity_get_vector(mascot,EV_VEC_origin,morig)
   new x
   for(x=0;x<3;x++)
      iMOrig[x] = floatround(morig[x])

   fakedamage(id,"Terminator",dmg,1)

   new hp = get_user_health(id)
   if(hp < 0)
      increaseTeamXP(team, 25)

   new loc = (team == 1 ? 100 : 140)
   message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
   write_byte(0)
   write_coord(iMOrig[0])         //(start positionx)
   write_coord(iMOrig[1])         //(start positiony)
   write_coord(iMOrig[2] + loc)         //(start positionz)
   write_coord(orig[0])         //(end positionx)
   write_coord(orig[1])      //(end positiony)
   write_coord(orig[2])      //(end positionz)
   write_short(g_fxBeamSprite)          //(sprite index)
   write_byte(0)          //(starting frame)
   write_byte(0)          //(frame rate in 0.1's)
   write_byte(7)          //(life in 0.1's)
   write_byte(120)          //(line width in 0.1's)
   write_byte(25)          //(noise amplitude in 0.01's)
   write_byte(250)         //r
   write_byte(0)         //g
   write_byte(0)         //b
   write_byte(220)         //brightness
   write_byte(1)          //(scroll speed in 0.1's)
   message_end()
}

glow(id, r, g, b, on) {
   if(on == 1) {
      set_rendering(id, kRenderFxGlowShell, r, g, b, kRenderNormal, 255)
      entity_set_float(id, EV_FL_renderamt, 1.0)
   }
   else if(!on) {
      set_rendering(id, kRenderFxNone, r, g, b,  kRenderNormal, 255)
      entity_set_float(id, EV_FL_renderamt, 1.0)
   }
   else if(on == 10) {
      set_rendering(id, kRenderFxGlowShell, r, g, b, kRenderNormal, 255)
      entity_set_float(id, EV_FL_renderamt, 1.0)
   }
}

on_fire()
{
   new rx, ry, rz, Float:forig[3], forigin[3], x
   fire_delay = get_gametime()

   rx = random_num(-5, 5)
   ry = random_num(-5, 5)
   rz = random_num(-5, 5)
   entity_get_vector(aball, EV_VEC_origin, forig)
   for(x=0;x<3;x++)
      forigin[x] = floatround(forig[x])

   message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
   write_byte(17)
   write_coord(forigin[0] + rx)
   write_coord(forigin[1] + ry)
   write_coord(forigin[2] + 10 + rz)
   write_short(Burn_Sprite)
   write_byte(7)
   write_byte(235)
   message_end()
}

beam() {
   message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
   write_byte(22)       // TE_BEAMFOLLOW
   write_short(aball)    // ball
   write_short(beamspr)// laserbeam
   write_byte(BALL_BEAM_LIFE)   // life
   write_byte(BALL_BEAM_WIDTH)   // width
   write_byte(BALL_BEAM_RED)   // R
   write_byte(BALL_BEAM_GREEN)   // G
   write_byte(BALL_BEAM_BLUE)   // B
   write_byte(BALL_BEAM_ALPHA)   // brightness
   message_end()
}

flameWave(myorig[3]) {
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY, myorig)
    write_byte( 21 )
    write_coord(myorig[0])
    write_coord(myorig[1])
    write_coord(myorig[2] + 16)
    write_coord(myorig[0])
    write_coord(myorig[1])
    write_coord(myorig[2] + 500)
    write_short( fire )
    write_byte( 0 ) // startframe
    write_byte( 0 ) // framerate
    write_byte( 15 ) // life 2
    write_byte( 50 ) // width 16
    write_byte( 10 ) // noise
    write_byte( 255 ) // r
    write_byte( 0 ) // g
    write_byte( 0 ) // b
    write_byte( 255 ) //brightness
    write_byte( 1 / 10 ) // speed
    message_end()

    message_begin(MSG_BROADCAST,SVC_TEMPENTITY,myorig)
    write_byte( 21 )
    write_coord(myorig[0])
    write_coord(myorig[1])
    write_coord(myorig[2] + 16)
    write_coord(myorig[0])
    write_coord(myorig[1])
    write_coord(myorig[2] + 500)
    write_short( fire )
    write_byte( 0 ) // startframe
    write_byte( 0 ) // framerate
    write_byte( 10 ) // life 2
    write_byte( 70 ) // width 16
    write_byte( 10 ) // noise
    write_byte( 255 ) // r
    write_byte( 50 ) // g
    write_byte( 0 ) // b
    write_byte( 200 ) //brightness
    write_byte( 1 / 9 ) // speed
    message_end()

    message_begin(MSG_BROADCAST,SVC_TEMPENTITY,myorig)
    write_byte( 21 )
    write_coord(myorig[0])
    write_coord(myorig[1])
    write_coord(myorig[2] + 16)
    write_coord(myorig[0])
    write_coord(myorig[1])
    write_coord(myorig[2] + 500)
    write_short( fire )
    write_byte( 0 ) // startframe
    write_byte( 0 ) // framerate
    write_byte( 10 ) // life 2
    write_byte( 90 ) // width 16
    write_byte( 10 ) // noise
    write_byte( 255 ) // r
    write_byte( 100 ) // g
    write_byte( 0 ) // b
    write_byte( 200 ) //brightness
    write_byte( 1 / 8 ) // speed
    message_end()

    //Explosion2
    message_begin( MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte( 12 )
    write_coord(myorig[0])
    write_coord(myorig[1])
    write_coord(myorig[2])
    write_byte( 80 ) // byte (scale in 0.1's) 188
    write_byte( 10 ) // byte (framerate)
    message_end()

    //TE_Explosion
    message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
    write_byte( 3 )
    write_coord(myorig[0])
    write_coord(myorig[1])
    write_coord(myorig[2])
    write_short( fire )
    write_byte( 65 ) // byte (scale in 0.1's) 188
    write_byte( 10 ) // byte (framerate)
    write_byte( 0 ) // byte flags
    message_end()

    //Smoke
    message_begin( MSG_BROADCAST,SVC_TEMPENTITY,myorig)
    write_byte( 5 ) // 5
    write_coord(myorig[0])
    write_coord(myorig[1])
    write_coord(myorig[2])
    write_short( smoke )
    write_byte( 50 )  // 2
    write_byte( 10 )  // 10
    message_end()

    return PLUGIN_HANDLED
}
Аватара пользователя
VenomIvanof
 
Сообщения: 66
Зарегистрирован: 02 апр 2016, 13:26
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Языки программирования: Counter-Strike 1.6

Re: How can i add second ball in soccerjam?

Сообщение Pafos » 23 апр 2016, 11:05

VenomIvanof, the function createball creates a ball (573 lines) . look where the it gets called .
Аватара пользователя
Pafos
 
Сообщения: 574
Зарегистрирован: 07 апр 2014, 18:03
Откуда: pfnClientConnect
Забанен
Благодарил (а): 129 раз.
Поблагодарили: 97 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn

Re: How can i add second ball in soccerjam?

Сообщение VenomIvanof » 23 апр 2016, 12:53

Pafos писал(а):VenomIvanof, the function createball creates a ball (573 lines) . look where the it gets called .



yeah i saw this, but i don't know how to create a second ball for playing .. i tryed 1 plugin from JB > when i write /ballmenu it show me a menu which i can add balls, but they cant be used cuz they are not for soccerjam ...
Аватара пользователя
VenomIvanof
 
Сообщения: 66
Зарегистрирован: 02 апр 2016, 13:26
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Языки программирования: Counter-Strike 1.6


Вернуться в Scripting

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5