/** drug zwiekszajacy energie gracza
 */
public class DrugHealthex extends Drug
{
     DrugHealthex()
    {
        super();
		
        MeshName="Data/Meshes/Equipment/drag_health.3DA";
         
        nInvIndex = _E_DRUG_HEALTH;
        nInvType = EInvObjType._EQUIP;
        sName = "&E_N_HEALTHEX&";
        sInfo = "&E_D_HEALTHEX&";
        sTexFileName = "Data/Textures/CH_I_Weapons2.png";
      	nCellsWidth = 1;
	    nCellsHeight = 2;
        
        //wspolrzedne polozenia na teksturze
        nOnTexPosX = 0.0f;
        nOnTexPosY = 200.0f;
        
        //rozmiary tekstury
        nTexSizeX = 256.0f;
        nTexSizeY = 256.0f;
        
        // Nazwa i sciezka do tekstury ktora ma pojawiac sie na HUDzie po wciagnieciu druga
        sHUDTexFileName = "Data/Textures/healthpack.png";
    
        // Wspolrzedne na teksturze ikonki pojawiajacej sie na HUDzie
     
        nHUDOnTexPosX = 0;
        nHUDOnTexPosY = 0;
    
        // rozmiary tekstury z ikonka druga pojawiajacego sie na HUDzie
     
        nHUDTexSizeX = 32.0f;
        nHUDTexSizeY = 32.0f;
    
        // Rozmiar ikonki druga na texturze
     
        nOnTexSizeX = 32;
        nOnTexSizeY = 32;
        
        /** poziom toksycznosci drug'a */
        fDrugToxicLevel = 40.f;
        
        fDurationTime = fHealthUnitAdding/fAddingSpeed;

    }
    /** dzwiek, ktory wczytywany jest podczas uzycia
     */        
    public String sWave = "Data/Sounds/DrugInjection.wav";//#EXPLOSIVES

    

    //---------------------------------------------
    // **** atrybuty specyficzne dla tego druga ***
    //---------------------------------------------
    
    /** ilosc jednostek zdrowia dodawanych graczowi po uzyciu
     */
    float fHealthUnitAdding = 1000.0f;
    
    /** ilosc jednostek jakie dodawane sa graczowi w podanej jednostce czasu
     */
    float fAddingUnits = 100.0f;
    
    /** co jaki czas graczowi dodawana jest okreslona ilosc jednostek zdrowia (w sec)
     */
    float fAddingSpeed = 0.5f;
    
    
    /** pomocnicze zmienne
     */    
    float fUnitAlreadyAdded = 0.0f;
    
    public void Use()
    {
        super.Use();
        if (Owner instanceof PlayerNet)
            fHealthUnitAdding = 2*Owner.fMaxHealth;
            
        fDurationTime = (fHealthUnitAdding/fAddingUnits)*fAddingSpeed;
                
        if (Owner!=null)
        {
            RemoveDrugFromInventory();
            PlayerHUD playerH = (PlayerHUD) Owner;
            playerH.HUD.GetHUDPlayer().SetTextHealth(playerH.fHealth);
            
            if ( playerH != null && playerH.bNetIsOwner )
                PlayWave( sWave );
            
            // wyslanie komunikatu do modulu ze gracz uzyl lekarstwa
            if ( GetModule() != null && GetModule() instanceof ChromeModuleSingle )
            {
                ((ChromeModuleSingle)GetModule()).MessageToHints( HintManager._MSG_HEALTHEXUSED );
            }
        }
        fUnitAlreadyAdded = 0.0f;
        CallMethodEvery("AddingUnits",fAddingSpeed);
    }
	
    void AddingUnits()
    {
        if((GetModule() instanceof ChromeModuleSingle) && IsLeaning3_()) fAddingUnits = -20.f;
        
        //Log("dodaje zycie \n");
        if (Owner!= null)
        {
            if (fUnitAlreadyAdded >= fHealthUnitAdding)
            {
                StopAddingUnits();
                
            }
            else
            {
                if (Owner.fHealth >= Owner.fMaxHealth-fAddingUnits)
                    Owner.fHealth = Owner.fMaxHealth;
                else
                    Owner.fHealth+= fAddingUnits;
                
                fUnitAlreadyAdded+=fAddingUnits;
                try 
                {
                 PlayerHUD playerH = (PlayerHUD)Owner;
                 if ((playerH.HUD!= null) && (playerH.HUD.aHUDComponent[playerH.HUD._PLAYER_DATA])!=null)
                    playerH.HUD.GetHUDPlayer().SetTextHealth(playerH.fHealth);
                 
                } catch (Exception ex)
                {
                    
                }
                
            }
        }//if Owner != null
        
    }
    
//-----------------------------------------------------------------------------------------
    /** metoda wywolywana gdy zakonczone zostanie dzialanie druga
     */
    void StopAddingUnits()
    {
     DisableCallMethod("AddingUnits");   
     if (nDrugIdx!=-1)
     {
        if (Owner!=null) 
        {
			PlayerHUD playerH = (PlayerHUD)Owner;
			playerH.HUD.GetHUDPlayer().SetTextHealth(playerH.fHealth);
        }//if owner!=null
         
     }//if
     
     //Log("koniec dodawania zycia \n");
    }
    
    void StopUse()
    {
        super.StopUse();
        StopAddingUnits();
    }
	
    void Clean()
    {
        super.Clean();
        fUnitAlreadyAdded = 0;
    }
    
    //*********************************************************
	//					SaveGame
    //*********************************************************
	
    /** Metoda wczytujaca zapisane dane w Save gracza
     */	
    public void SGLoadChunk(FileChunk cParentFC)
    {	
		FileChunk.Log("[DrugHealthex.SGLoadChunk]\n");
		
		FileChunk cFC = GameObject.LoadChunk(cParentFC);   
		
        if (cFC.GetID() == ESGChunksChrome._CHK_INV_OBJECT)
        {	
			super.SGLoadChunk(cFC);
			
			fUnitAlreadyAdded = cFC.LoadFloat();			
			
        }
		
		cFC.delete();
    }
    
    /** Metoda zapisujaca dane do Save gracza
     */	
    public void SGSaveChunk(FileChunk cFCParent)
    {
		FileChunk.Log("[DrugHealthex.SGSaveChunk]\n");
		
        FileChunk cFC = NewChunk(ESGChunksChrome._CHK_INV_OBJECT, cFCParent);
		
		super.SGSaveChunk(cFC);
		    
		cFC.SaveFloat(fUnitAlreadyAdded);		
        
        cFC.delete();
    }	    		
}
