// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
// Copyright (C) 2004 Lukasz Wlasinski.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
//     https://alliedmods.net/amxmodx-license

//
// TSX Module
//

#ifndef CMISC_H
#define CMISC_H

#include "amxxmodule.h"
#include "CRank.h"

#define TSMAX_CUSTOMWPNS		5
#define TSMAX_WEAPONS			39 + TSMAX_CUSTOMWPNS


#if defined(_WIN32)
#define TSKNIFE_OFFSET			31 // owner offset in knife entity
#else
#define TSKNIFE_OFFSET			35
#endif

#define TSPWUP_SLOWMO			1
#define TSPWUP_INFAMMO			2
#define TSPWUP_KUNGFU			4
#define TSPWUP_SLOWPAUSE		8
#define TSPWUP_DFIRERATE		16
#define TSPWUP_SJUMP			256

#if defined(__linux__) || defined(__APPLE__)
#define EXTRAOFFSET	5
#else
#define EXTRAOFFSET 0
#endif

#define TSX_SDUCK_OFFSET		(27+EXTRAOFFSET)
#define TSX_SPEED1_OFFSET		(85+EXTRAOFFSET)
#define TSX_PHYSICS_OFFSET		(86+EXTRAOFFSET)
#define TSX_BTRAIL_OFFSET		(87+EXTRAOFFSET)
#define TSX_ISSLO_OFFSET		(89+EXTRAOFFSET)
#define TSX_SPEED2_OFFSET		(90+EXTRAOFFSET)
#define TSX_SROLL_OFFSET		(158+EXTRAOFFSET)
#define TSX_MONEY_OFFSET		(301+EXTRAOFFSET)
#define TSX_SLOTS_OFFSET		(304+EXTRAOFFSET)
#define TSX_SLOMO1_OFFSET		(423+EXTRAOFFSET)
#define TSX_SLOMO2_OFFSET		(425+EXTRAOFFSET)
#define TSX_MSG_OFFSET			(433+EXTRAOFFSET)
#define TSX_TIME_OFFSET			(444+EXTRAOFFSET)

#define TSITEM_KUNGFU			1<<0
#define TSITEM_SUPERJUMP		1<<1

#define TSKF_STUNTKILL			1<<0
#define TSKF_SLIDINGKILL		1<<1
#define TSKF_DOUBLEKILL			1<<2
#define TSKF_ISSPEC				1<<3 // is specialist
#define TSKF_KILLEDSPEC			1<<4 // killed specialist

// *****************************************************
// class CPlayer
// *****************************************************

struct CPlayer {

	edict_t* pEdict;
	char ip[32];
	int index;
	int teamId;
	int aiming;
	int current;

	int space;
	int money;
	int PwUp;
	int PwUpValue;
	int items; // "stale" przedmioty , super jump i kung fu bonus

	//
	int killingSpree;
	int is_specialist;
	int killFlags;
	int lastFrag; // oblicz ostatni frag, sprawdza czy poprawna jest detekcja broni i bonusow 
	float lastKill;  // kiedy ostatni , dla double kill
	//
	int frags; // suma dla kontroli ostatniego fraga, to - v.frags = lastfrag

	bool ingame;
	float clearStats;

	int checkstate;
	int state;
	int oldstate;
	
	struct PlayerWeapon : public Stats {
		char*		name;
		int			ammo;
		int			clip;
		int			mode; // burst , full auto ..
		int			attach; // scope ,laser
	};

	PlayerWeapon	weapons[TSMAX_WEAPONS];
	PlayerWeapon	attackers[33];
	PlayerWeapon	victims[33];
	Stats			weaponsRnd[TSMAX_WEAPONS]; // DEC-Weapon (Round) stats
	Stats			life;

	RankSystem::RankStats*	rank;

	void Init(  int pi, edict_t* pe );
	void Connect( const char* ip );
	void PutInServer();
	void Disconnect();
	void saveKill(CPlayer* pVictim, int weapon, int hs, int tk);
	void saveHit(CPlayer* pVictim, int weapon, int damage, int aiming);
	void saveShot(int weapon);
	void restartStats(bool all = true);
	void SetMoney(int money);
	void SetSlots(int slots);
	int GetSlots();
	void SetOffset(int offs, int val);
	int GetOffset(int offs);
	void SetOffsetF(int offs, float val);
	float GetOffsetF(int offs);
	float GetTime();

	inline bool IsBot(){
		const char* auth= (*g_engfuncs.pfnGetPlayerAuthId)(pEdict);
		return ( auth && !strcmp( auth , "BOT" ) );
	}
	inline bool IsAlive(){
		return ((pEdict->v.deadflag==DEAD_NO)&&(pEdict->v.health>0));
	}
};

#endif // CMISC_H