//	VIETCONG 1
//	DE_AmmoBox script v3.3
//  Writen for custom object -  DE_AmmoBox.bes
//	made by Ando


/*

	______________DESCRIPTION:
All you see is synchronized and visible to others.
Player can use ammo box to receive ammo.  
When player is using it, box cover is moving, one kit is moving up and disappearing from box.Player see message how much kits are left.
DE_AmmoBox.bes contains 16 ammo kit's. When last kit are taken then box stay in open state and player will see message "Box is empty now"
Payer can't use it when he already have ammo full and he receive message "Ammo full".
When ammo boxes are disabled in server settings then box appear in empty state and player see info text  "Medic box is disabled by server" when used.
All is restored after restart.


	______________TUTORIAL FOR EDITOR
This script is writen for custom object "DE_ammobox.bes"
Place ammobox object to scene and assign script to that object.
This script is synchronized in multiplayer. You only must use mode script with Automatic sync. support.
Synchronization channel is added automatically


	______________TUTORIAL FOR 3DS MAX:
Create objects: box, cover and kit's. Kit's must use same name, except end number is increasing and start with 0.
Example "Kit_0", "Kit_1"... and so on.
Kit's count can be up to 20 and is detected automatically in script.
Fix your cover and kit’s names in this script.
You must add some settings to your "cover" object in 3DS MAX:
Phy_colshp=2
Phy_misshp=2
Phy_status=0
Script isn't working without those settings!!!	



	_____________HISTORY:
//	1.0 - automatic Global variable system
//	1.2 - cleaned after test
//	2.1 - When ammoboxes are disabled in server then using empty box
//	3.0 - tested with team
//	3.1 - Changed use distance from 0.5 to 0.8	//recommendation by intruder and testers
//  3.1 - added info text "Ammo full"	//recommendation by intruder and testers
//  3.1 - added info text "Box is empty now"	//recommendation by intruder and testers
//  3.2 - added kit movement
//  3.3 - removed kit's when box is disabled in server
//  3.3 - added info text  "Medic box is disabled by server"
*/

#include <inc\sc_global.h>
#include <inc\sc_def.h>



//____________________________OBJECT PARAMETERS____________________________

//OBJECT STATES: 0 - box not used, 1,2,3,.... ammo bags taken			
//-2 = disabled in server

//#define ADD_WEAPON				 63  //63 – medikit	//61 – Ammobag
#define USE_STRING				104//#104: 	#tee  to take ammo

#define CLOSESOUND				475	//        
#define OPENSOUND				476	//
#define COLL_SOUND				247			//small hit sound when box cover is closing
#define OPENINGTIME				1.0f		//time to move (open/close) box cover      
#define STAY_OPEN_TIME			0.5f	
#define ROT_ANGLE				130.0f		//rotation angle of box cover
#define USE_DISTANCE			0.8f		//
#define MOVE_UP_KIT				0.3f		//
#define	cover_sub_obj			"Cover"		//box cover object
#define	med_sub_obj				"ammo%d"	//ammo kid objects

//___________________________PART OF AUTOMATIC SYNC. CANNEL________________

#define GVAR_SERVER				600 		// 0 - not server, 1 - server
#define GVAR_COUNT				601 		// Channel for G-var count
#define GVAR_GPHASE				500			// 1 - game is in starting state (reseting object)
//_________________________________________________________________________


void		*cover_sub_obj_id;
void		*med_sub_obj_id;

float val = 0.0f;
float timer = 0.0f;

c_Vector3		door_vec;

s_SC_NOD_transform trans;
s_SC_NOD_transform orig_trans;
s_SC_NOD_transform orig_trans_med;

int			Temp = 0;	//global state of object.
int			Temp2 = -1;	//local state of object.  -1 = unknown ststus  (for start/restart)
int			Temp3 = 0;	//sub stste of object
int			i;
int			my_gvar_count;
int			my_gvar;	//object Gver 
int			obj_count=0;
int			curr_obj=0;

dword	net_id;

//BOOL		add_med		=FALSE;
BOOL		startsound	=FALSE;
BOOL		HasShoot	=FALSE;

char	txt[32];


int ScriptMain(s_SC_OBJ_info *info){
	switch(info->event_type){
		case SC_OBJ_INFO_EVENT_INIT:
			obj_count=0;
			for(i= 1; i < 20; i++){//count of objects
				sprintf(txt, med_sub_obj, i);
				if (SC_NOD_GetNoMessage(info->master_nod, txt))obj_count++;

			}
			if (obj_count>0){
				sprintf(txt, med_sub_obj, 1);
				med_sub_obj_id= SC_NOD_GetNoMessage(info->master_nod, txt);
				SC_NOD_GetTransform(med_sub_obj_id,&orig_trans_med);
			}
			cover_sub_obj_id  = SC_NOD_GetNoMessage(info->master_nod, cover_sub_obj);
			SC_NOD_GetTransform(cover_sub_obj_id,&orig_trans);
			SC_NOD_GetWorldPos(cover_sub_obj_id,&door_vec); 
			//____________creating global variable
			my_gvar_count = SC_ggi(GVAR_COUNT)+1;
			SC_sgi(GVAR_COUNT,my_gvar_count);
			my_gvar = my_gvar_count+ 601;
			//____________
			return TRUE;
		case SC_OBJ_INFO_EVENT_JUSTLOADED:
			break;
		case SC_OBJ_INFO_EVENT_RELEASE:
			SC_NOD_SetTransform(cover_sub_obj_id,&orig_trans);
			for(i= 1; i < obj_count+1; i++){//count of objects
				sprintf(txt, med_sub_obj, i);
				med_sub_obj_id=SC_NOD_GetNoMessage(info->master_nod, txt);
				if (med_sub_obj_id){// to avoid bugs
					trans=orig_trans_med;
					SC_NOD_SetTransform(med_sub_obj_id,&trans); 
				}

			}
			break;
		case SC_OBJ_INFO_EVENT_HIT: 

			//if(SC_NOD_GetNoMessage_Entity("Item M16#1")) SC_message("WORKING____Item M16#1");



			//if (SC_NOD_GetNoMessage(NULL,"Default"))SC_message("WORKING_____ Default" );		

			//net_id = SC_Item_Find(21);
			//SC_Osi("item: %d",net_id);
			break;
		case SC_OBJ_INFO_EVENT_DOTICK:
			switch(SC_ggi(GVAR_GPHASE)){
			case 101: // gphase_begin for nonstandart gamemodes
			case 102: // gphase_begin for nonstandart gamemodes
			case 1:  
				Temp2 = -1;	//restores unknown state for door
				return TRUE;
				break;
			}//switch(gPhase)
			//______________start/restart status for server____________
			if (Temp2 == -1){ //restores stsrt state
				if (SC_ggi(GVAR_SERVER) == 1){
					//get server ammobox settings
					if(SC_MP_GetAmmoBoxesEnabled()){
						SC_sgi(my_gvar,0); // status on start/restart
					}else{
						SC_sgi(my_gvar,-2);  // status on start/restart
					}
				}
			}
			Temp = SC_ggi(my_gvar);
			//______________use string__________
			if (Temp == Temp2){	
				if (obj_count>Temp){
					val = SC_DOBJ_CameraLooksAt(cover_sub_obj_id,2);
					if (val<USE_DISTANCE){
						SC_ACTIVE_Add(info->master_nod,2.0f*val,USE_STRING);
					}
				}
			}
			//_____________CHANGE OBJECT STATUS________________
			if (Temp != Temp2){	//temp- Global state    Temp2 - Local state
				if (Temp == -2){//Med box disabled in server
					trans=orig_trans;
					trans.rot.y+= DEG_TO_RAD(ROT_ANGLE);
					SC_NOD_SetTransform(cover_sub_obj_id,&trans); 
					startsound = TRUE;//??????
					timer=0;
					Temp2=-2;
					Temp3=0;
					for(i= 1; i < obj_count+1; i++){//count of objects
						sprintf(txt, med_sub_obj, i);
						med_sub_obj_id=SC_NOD_GetNoMessage(info->master_nod, txt);
						if (med_sub_obj_id){// to avoid bugs
							trans=orig_trans_med;
							trans.loc.z =-1000;
							SC_NOD_SetTransform(med_sub_obj_id,&trans); 
						}
					}
					return TRUE;
				}
				
				
				
				
				if (Temp==0){//not used
					SC_NOD_SetTransform(cover_sub_obj_id,&orig_trans);
					startsound = TRUE;//??????
					timer=0;
					Temp2=0;//?????	
					Temp3=0;
					for(i= 1; i < obj_count+1; i++){//count of objects
						sprintf(txt, med_sub_obj, i);
						med_sub_obj_id=SC_NOD_GetNoMessage(info->master_nod, txt);
						if (med_sub_obj_id){// to avoid bugs
							trans=orig_trans_med;
							SC_NOD_SetTransform(med_sub_obj_id,&trans); 
						}
					}
					return TRUE;
				}
				//if (Temp>obj_count){//set box empty status
				//	trans=orig_trans;
				//	trans.rot.y+= DEG_TO_RAD(ROT_ANGLE);
				//	SC_NOD_SetTransform(cover_sub_obj_id,&trans); 
				//	startsound = TRUE;//?????
				//	timer=0;
				//	Temp2=Temp;
				//	return TRUE;
				//}
				if (Temp>0){//use box
					timer+=info->time;
					switch(Temp3){
					case 0:	//Temp3//opening box
						if (startsound){
							SC_SND_PlaySound3D(OPENSOUND,&door_vec);
							startsound = FALSE;
						}
						trans=orig_trans;
						trans.rot.y+=1*(DEG_TO_RAD(ROT_ANGLE)/2+(DEG_TO_RAD(ROT_ANGLE)/2 *sin((DEG_TO_RAD(180)*timer/OPENINGTIME)- DEG_TO_RAD(90))));
						SC_NOD_SetTransform(cover_sub_obj_id,&trans); 
						if (timer >= OPENINGTIME){
							timer=0;
							Temp3++;
						}
						break;
					case 1: //Temp3//stay shortly opened
						//move kit object
						//SC_Osi("time %1.1f",timer);
						for(i= curr_obj; i < Temp; i++){//for - because when 2 players using object in a same time
							sprintf(txt, med_sub_obj, i+1);
							med_sub_obj_id=SC_NOD_GetNoMessage(info->master_nod, txt);
							if (med_sub_obj_id){// to avoid bugs
								trans=orig_trans_med;
								trans.loc.z+= MOVE_UP_KIT * timer/STAY_OPEN_TIME;
								SC_NOD_SetTransform(med_sub_obj_id,&trans); 
							}
						}
						if (timer >= (STAY_OPEN_TIME)){
							if (Temp>=obj_count){
								trans=orig_trans;
								trans.rot.y+= DEG_TO_RAD(ROT_ANGLE);
								SC_NOD_SetTransform(cover_sub_obj_id,&trans); 
								startsound = TRUE;//?????
								timer=0;
								Temp2=Temp;
								return TRUE;
							}
							//remove object
							for(i= curr_obj; i < Temp; i++){//for - because when 2 players using object in a same time
								sprintf(txt, med_sub_obj, i+1);
								med_sub_obj_id=SC_NOD_GetNoMessage(info->master_nod, txt);
								if (med_sub_obj_id){// to avoid bugs
									trans=orig_trans_med;
									trans.loc.z=-1000;
									SC_NOD_SetTransform(med_sub_obj_id,&trans); 
								}
							}
							curr_obj=Temp;
							startsound = TRUE;
							timer=0;
							Temp3++;
						}
						break;
					case 2: //Temp3//closing box
						if (startsound){
							if (HasShoot){//add med to PC who used object
								SC_P_AddAmmoNoGrenade(SC_PC_Get());
								HasShoot= FALSE;
							}
							SC_SND_PlaySound3D(CLOSESOUND,&door_vec);
							startsound = FALSE;
						}
						trans=orig_trans;
						trans.rot.y+=-1*(DEG_TO_RAD(ROT_ANGLE)/2+(DEG_TO_RAD(ROT_ANGLE)/2 *sin((DEG_TO_RAD(180)*timer/OPENINGTIME)- DEG_TO_RAD(90))));
						trans.rot.y+=DEG_TO_RAD(ROT_ANGLE);
						SC_NOD_SetTransform(cover_sub_obj_id,&trans); 
						if (timer >= OPENINGTIME){
							SC_SND_PlaySound3D(COLL_SOUND,&door_vec);
							Temp3++;
						}
						break;
					case 3: //Temp3//box closed
						//BOOL SC_P_GetHasShoot(SC_PC_Get());//for ammo box
						SC_NOD_SetTransform(cover_sub_obj_id,&orig_trans);
						startsound = TRUE;//??????
						timer=0;
						Temp2=Temp;	
						Temp3=0;
						break;
					}
				}
			}
            break;
		case SC_OBJ_INFO_EVENT_USED:

			if (Temp == -2){//ammo/med box disabled in server
				SC_GameInfo(NULL, "Ammo box is disabled by server");
				return TRUE;
			}

			if ((SC_P_GetHasShoot(SC_PC_Get())) || (HasShoot)){
				Temp = SC_ggi(my_gvar);
				SC_sgi(my_gvar,Temp+1);		//  start opening
				HasShoot=TRUE;
				if (Temp>=obj_count-1){
					SC_GameInfo(NULL, "Box is empty now");

				}else{
					sprintf(txt, "%d  kit's left", (obj_count - Temp - 1));
					SC_GameInfo(NULL, txt);
				}
			}else{
				SC_GameInfo(NULL, "Ammo full");
			}
        break;
   }// switch(info->event_type)
   return FALSE;
}// int ScriptMain(s_OBJ_info *info)
