/*
 * DoDX 
 * Copyright (c) 2004 Lukasz Wlasinski
 *
 *
 *    This program is free software; you can redistribute it and/or modify it
 *    under the terms of the GNU General Public License as published by the
 *    Free Software Foundation; either version 2 of the License, or (at
 *    your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful, but
 *    WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *    General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software Foundation,
 *    Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *    In addition, as a special exception, the author gives permission to
 *    link the code of this program with the Half-Life Game Engine ("HL
 *    Engine") and Modified Game Libraries ("MODs") developed by Valve,
 *    L.L.C ("Valve").  You must obey the GNU General Public License in all
 *    respects for all of the code used other than the HL Engine and MODs
 *    from Valve.  If you modify this file, you may extend this exception
 *    to your version of the file, but you are not obligated to do so.  If
 *    you do not wish to do so, delete this exception statement from your
 *    version.
 *
 */
#include "amxxmodule.h"
#include "dodx.h"

void Client_ResetHUD_End(void* mValue){
	mPlayer->clearStats = gpGlobals->time + 0.25f;
}

void Client_RoundState(void* mValue){
	if ( mPlayer ) return;
	int result = *(int*)mValue;
	if ( result == 1 ){
		for (int i=1;i<=gpGlobals->maxClients;i++){
			CPlayer *pPlayer = GET_PLAYER_POINTER_I(i);
			if (pPlayer->ingame) {
				pPlayer->clearRound = gpGlobals->time + 0.25f;
			}
		}
	}
}

void Client_TeamScore(void* mValue){
	static int index;
	switch(mState++){
	case 0:
		index = *(int*)mValue;
		break;
	case 1:
		switch (index){
		case 1:
			AlliesScore = *(int*)mValue;
			break;
		case 2:
			AxisScore = *(int*)mValue;
			break;
		}
		break;
	}
}

void Client_ObjScore(void* mValue){
	static CPlayer *pPlayer;
	static int score;
	switch(mState++){
	case 0:
		pPlayer = GET_PLAYER_POINTER_I(*(int*)mValue);
		break;
	case 1:
		score = *(int*)mValue;
		if ( (pPlayer->lastScore = score - pPlayer->savedScore) && isModuleActive() ){
			pPlayer->updateScore(pPlayer->current,pPlayer->lastScore);
			pPlayer->sendScore = gpGlobals->time + 0.25f;
		}
		pPlayer->savedScore = score;
		break;
	}
}


void Client_CurWeapon(void* mValue){
  static int iState;
  static int iId;
  switch (mState++){
  case 0: 
    iState = *(int*)mValue;
    break;
  case 1:
    if (!iState) break; 
    iId = *(int*)mValue;
	break;
  case 2:
    if ( !iState || !isModuleActive() )
		break;
	int iClip = *(int*)mValue;
	mPlayer->current = iId;

   	if ( weaponData[iId].needcheck ){
		iId = get_weaponid(mPlayer);
		mPlayer->current = iId;
	}

	if (iClip > -1) {
		if ( mPlayer->current == 17 ){
			if ( iClip+2 == mPlayer->weapons[iId].clip)
				mPlayer->saveShot(iId);
		}
		else {
			if ( iClip+1 == mPlayer->weapons[iId].clip)
				mPlayer->saveShot(iId);
		}
	}
    mPlayer->weapons[iId].clip = iClip;
  }
}

/*
Nie ma damage event ...
*/
void Client_Health_End(void* mValue){

    if ( !isModuleActive() )
		return;

	edict_t *enemy = mPlayer->pEdict->v.dmg_inflictor;
	int damage = (int)mPlayer->pEdict->v.dmg_take;

	if ( !mPlayer || !damage || !enemy )
		return;
	
	int weapon = 0;
	int aim = 0;
		
	mPlayer->pEdict->v.dmg_take = 0.0; 

	
	CPlayer* pAttacker = NULL;

	if ( enemy->v.flags & (FL_CLIENT | FL_FAKECLIENT) ){
		pAttacker = GET_PLAYER_POINTER(enemy);
		weapon = pAttacker->current;
		if ( weaponData[weapon].needcheck )
			weapon = get_weaponid(pAttacker);
		aim = pAttacker->aiming;
		if ( weaponData[weapon].melee )
			pAttacker->saveShot(weapon);
	}
	else 
		g_grenades.find( enemy , &pAttacker , weapon );

	int TA = 0;
	
	if ( !pAttacker ){
		pAttacker = mPlayer;
	}

	if ( pAttacker->index != mPlayer->index ){ 
		pAttacker->saveHit( mPlayer , weapon , damage, aim );
		if ( mPlayer->pEdict->v.team == pAttacker->pEdict->v.team )
			TA = 1;
	}

	MF_ExecuteForward( iFDamage,pAttacker->index, mPlayer->index, damage, weapon, aim, TA );

	if ( !mPlayer->IsAlive() ){
		pAttacker->saveKill(mPlayer,weapon,( aim == 1 ) ? 1:0 ,TA);

		MF_ExecuteForward( iFDeath,pAttacker->index, mPlayer->index, weapon, aim, TA );
	}
}

void Client_AmmoX(void* mValue){
  static int iAmmo;
  switch (mState++){
  case 0:
    iAmmo = *(int*)mValue;
    break;
  case 1:
	if (!mPlayer ) break;
    for(int i = 1; i < MAX_WEAPONS ; ++i) 
      if (iAmmo == weaponData[i].ammoSlot)
        mPlayer->weapons[i].ammo = *(int*)mValue;
  }
}

void Client_AmmoShort(void* mValue){
  static int iAmmo;
  switch (mState++){
  case 0:
    iAmmo = *(int*)mValue;
    break;
  case 1:
	if (!mPlayer ) break;
    for(int i = 1; i < MAX_WEAPONS ; ++i) 
      if (iAmmo == weaponData[i].ammoSlot)
        mPlayer->weapons[i].ammo = *(int*)mValue;
  }
}