class FishingRod_Base_New : ItemBase
{
void FishingRod_Base_New()
{
}
override void SetActions()
{
super.SetActions();
AddAction(ActionFishingNew);
}
override bool GetActionWidgetOverride(out typename name)
{
PlayerBase owner;
if (Class.CastTo(owner,GetHierarchyRootPlayer()))
{
ActionFishingNew action;
if (Class.CastTo(action,owner.GetActionManager().GetRunningAction()) && owner.GetActionManager().GetActionState() == UA_PROCESSING)
{
name = ActionDummyContinuousRelease;
return true;
}
}
return false;
}
override bool IsOpen()
{
return false;
}
void AnimateFishingRodEx(float phase, bool instant = false)
{
if (instant)
SetAnimationPhaseNow("AnimateRod",phase);
else
SetAnimationPhase("AnimateRod",phase);
}
override void OnDebugSpawn()
{
ItemBase hook;
for (int i = 0; i < 6; ++i)
{
if (Class.CastTo(hook,g_Game.CreateObjectEx("Hook", GetPosition(), ECE_PLACE_ON_SURFACE)))
hook.GetInventory().CreateAttachment("Worm");
}
if (Class.CastTo(hook,GetInventory().CreateAttachment("Hook")))
hook.GetInventory().CreateAttachment("Worm");
}
///////////////////////////////////////////////////
//! DEPRECATED, used to dictate catch chance
float GetFishingEffectivityBonus()
{
return 0.0;
}
//! DEPRECATED
void AnimateFishingRod(bool state)
{
AnimateFishingRodEx(state);
}
}
class FishingRod_Base : ItemBase
{
const string ANIM_PHASE_OPENED = "OpenRod";
const string ANIM_PHASE_CLOSED = "CloseRod";
const float BREAK_PULL = 36;
const float TOO_MUCH_PULL = 32;
const float HIGH_PULL = 22;
const float LOW_PULL = 18;
const float TOO_FEW_PULL = 8;
const float LOOSE_PULL = 0;
const int LOSS_BREAK = 0;
const int LOSS_LOOSE = 1;
const int WIN = 2;
const int INTERUPTED = 3;
const float INIT_LINE_STRETCH = 15;
const float MIN_FISHING_TIME = 100;
const float MAX_FISHING_TIME = 150;
const int FISH_PULL_CHANCE = 15;
const int FISH_AGILITY = 15;
int m_FishProximity;
bool m_Fishing;
ref Timer m_CyclerCatching;
ref Timer m_Cycler;
float m_Pull;
float m_DeltaT;
bool m_WasPulled;
bool m_IsFishPulling;
float m_PullTime;
float m_FishPull;
int m_FishingTime;
PlayerBase m_Player;
int m_ChanceRange;
void FishingRod_Base()
{
m_Fishing = false;
}
void Init()
{
m_Player = PlayerBase.Cast( g_Game.GetPlayer() );
m_Pull = INIT_LINE_STRETCH;
m_IsFishPulling = false;
//TIMERDEPRECATED - randomized time of fishing
m_FishingTime = Math.RandomInt(MIN_FISHING_TIME,MAX_FISHING_TIME);
m_ChanceRange = FISH_AGILITY;
m_FishProximity = FISH_AGILITY;
//TIMERDEPRECATED
if(!m_Cycler)
{
m_Cycler = new Timer();
}
if(!m_CyclerCatching)
{
m_CyclerCatching = new Timer();
}
m_CyclerCatching.Run(4, this, "Catching", NULL,true);
m_Player.Message("I have started fishing.", "colorFriendly");
}
bool IsFishingActive()
{
return m_Fishing;
}
void ActivateFishing()
{
m_Fishing = true;
//Init();
}
void DeactivateFishing()
{
End(INTERUPTED);
}
void FishPull()
{
if ( !m_IsFishPulling )
{
float rand = Math.RandomInt(1, FISH_PULL_CHANCE);
if ( rand <= 2 && m_Pull <= TOO_MUCH_PULL && m_Pull >= TOO_FEW_PULL )
{
//TIMERDEPRECATED - randomizing timeframe to pull fish out
if ( Math.RandomInt(0, 1) )
{
m_FishPull = rand;
}
else
{
m_FishPull = -rand;
}
//TIMERDEPRECATED - randomizing timeframe to pull fish out
m_PullTime = Math.RandomInt(2, 6);
m_IsFishPulling = true;
}
}
else
{
m_PullTime--;
if (m_PullTime == 0)
{
m_IsFishPulling = false;
}
}
}
void Catching()
{
if(m_FishProximity == 0 && m_WasPulled)
{
m_CyclerCatching.Stop();
m_Cycler.Run(0.3, this, "Pulling", NULL,true);
}
else
{
if (m_WasPulled)
{
m_WasPulled = false;
m_ChanceRange++;
}
//TIMERDEPRECATED - randomized proximity of fish to
m_FishProximity = Math.RandomInt(0,m_ChanceRange);
string fline = "";
for (int i = 0; i < m_FishProximity; i++)
{
fline += " .";
}
m_Player.Message("", "colorStatusChannel");
m_Player.Message("HOLD right mouse button to pull the fishing line", "colorAction");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("Start pulling when J and <*)))>< meet:", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("J"+fline+" <*)))><", "colorImportant");
if(m_ChanceRange > 0)
{
m_ChanceRange--;
}
}
}
void Pulling()
{
float agent_speed_distance = vector.Distance("0 0 0",m_Player.GetModelSpeed());
if (m_Player.GetItemInHands() != this || !m_Player.IsInWater() || agent_speed_distance > 1 )
{
End(INTERUPTED);
}
else
{
if ( m_FishingTime <= 0)
{
ItemBase pcatch = ItemBase.Cast( m_Player.GetInventory().CreateInInventory("Carp") );
//ItemBase pcatch = ItemBase.Cast( m_Player.CreateInInventory("Carp","cargo_bait") );
pcatch.SetQuantity(800,false);
End(WIN);
}
else
{
FishPull();
if ( m_IsFishPulling )
{
m_Pull += m_FishPull;
}
if (m_WasPulled)
{
m_Pull += 1;
}
else
{
m_Pull -= 1;
}
m_WasPulled = false;
m_FishingTime--;
DisplayState();
if ( m_Pull <= LOOSE_PULL)
{
End(LOSS_LOOSE);
}
if ( m_Pull >= BREAK_PULL)
{
End(LOSS_BREAK);
}
}
}
}
void End( int result )
{
m_Cycler.Stop();
m_CyclerCatching.Stop();
m_Fishing = false;
switch (result)
{
case LOSS_BREAK:
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("The fish had broken the fishing line and swam away.", "colorImportant");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
break;
case LOSS_LOOSE:
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("The fish escaped.", "colorImportant");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
break;
case WIN:
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("I caught the fish!", "colorFriendly");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
break;
case INTERUPTED:
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("Fishing time is over.", "colorFriendly");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
break;
default:
Print("Wrong number");
break;
}
}
void AddPull(float delta)
{
m_DeltaT = delta;
m_WasPulled = true;
}
void DisplayState()
{
string fline = "";
for (int i = 0; i < m_Pull; i++)
{
fline += "-";
}
m_Player.Message("", "colorStatusChannel");
m_Player.Message("HOLD right mouse button to pull the fishing line", "colorAction");
m_Player.Message("RELEASE right mouse button to loosen the fishing line", "colorAction");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
m_Player.Message("Fishing line stretch :", "colorStatusChannel");
m_Player.Message("", "colorStatusChannel");
if (m_Pull >= TOO_MUCH_PULL)
{
m_Player.Message("<"+fline+">", "colorImportant");
}
if ( m_Pull >= HIGH_PULL && m_Pull < TOO_MUCH_PULL)
{
m_Player.Message("<"+fline+">", "colorAction");
}
if ( m_Pull < HIGH_PULL && m_Pull > LOW_PULL)
{
m_Player.Message("<"+fline+">", "colorFriendly");
}
if ( m_Pull <= LOW_PULL && m_Pull > TOO_FEW_PULL)
{
m_Player.Message("<"+fline+">", "colorStatusChannel");
}
if (m_Pull <= TOO_FEW_PULL)
{
m_Player.Message("<"+fline+">", "colorImportant");
}
}
// Conditions
override bool CanPutInCargo( EntityAI parent )
{
if( !super.CanPutInCargo(parent) ) {return false;}
if ( GetAnimationPhase(ANIM_PHASE_CLOSED) > 0.5 )
{
return true;
}
return false;
}
override void SetActions()
{
super.SetActions();
//AddAction(ActionToggleFishing);
//AddAction(ActionFishingNew);
}
float GetFishingEffectivityBonus()
{
return 0.0;
}
}