/*
 * 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 - (int)(pPlayer->savedScore)) && isModuleActive() )
		{
			pPlayer->updateScore(pPlayer->current,pPlayer->lastScore);
			pPlayer->sendScore = (int)(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;
	}
  }
}

/*
Working on being able to modify and switch weapons as they are sent to the client

void WeaponList(void* value)
{
	if(!mPlayer)
		return;

	if(!mPlayer->ingame || ignoreBots(mPlayer->pEdict))
		return;

	switch(mPlayer->position)
	{
		case 0: MF_Log("pszName = %s", value); break;			// string	weapon name
		case 1: MF_Log("pszAmmo1 = %d", (int)value); break;		// byte		Ammo Type
		case 2: MF_Log("iMaxAmmo1 = %d", (int)value); break;	// byte     Max Ammo 1
		case 3: MF_Log("pszAmmo2 = %d", (int)value); break;		// byte		Ammo2 Type
		case 4: MF_Log("iMaxAmmo2 = %d", (int)value); break;	// byte     Max Ammo 2
		case 5: MF_Log("iSlot = %d", (int)value); break;		// byte		bucket
		case 6: MF_Log("iPosition = %d", (int)value); break;	// byte		bucket pos
		case 7: MF_Log("iId = %d", (int)value); break;			// byte		id (bit index into pev->weapons)
		case 8: MF_Log("iFlags = %d", (int)value); break;		// byte		Flags
	};

	mPlayer->position++;
}

void WeaponList_End(void* mValue)
{
	if(!mPlayer)
		return;

	MF_Log("Done with %d", mPlayer->position);
	mPlayer->position = 0;
}

struct weapon_info_s
{
	char *pszName;			// string	weapon name
	int pszAmmo1;			// byte		Ammo Type
	int iMaxAmmo1;			// byte     Max Ammo 1
	int pszAmmo2;			// byte		Ammo2 Type
	int iMaxAmmo2;			// byte     Max Ammo 2
	int iSlot;				// byte		bucket
	int iPosition;			// byte		bucket pos
	int iId;				// byte		id (bit index into pev->weapons)
	int iFlags;				// byte		Flags
}weapon_info_t;

MESSAGE_BEGIN( MSG_ONE, gmsgWeaponList, NULL, pev );  
	WRITE_STRING(pszName);			// string	weapon name
	WRITE_BYTE(GetAmmoIndex(II.pszAmmo1));	// byte		Ammo Type
	WRITE_BYTE(II.iMaxAmmo1);				// byte     Max Ammo 1
	WRITE_BYTE(GetAmmoIndex(II.pszAmmo2));	// byte		Ammo2 Type
	WRITE_BYTE(II.iMaxAmmo2);				// byte     Max Ammo 2
	WRITE_BYTE(II.iSlot);					// byte		bucket
	WRITE_BYTE(II.iPosition);				// byte		bucket pos
	WRITE_BYTE(II.iId);						// byte		id (bit index into pev->weapons)
	WRITE_BYTE(II.iFlags);					// byte		Flags
MESSAGE_END();
*/