Merge pull request #1353 from mc-server/Effects
Added speed entity effect.
This commit is contained in:
commit
5b63a7fe98
@ -1641,6 +1641,8 @@ a_Player:OpenWindow(Window);
|
|||||||
MobTypeToString = { Params = "{{cMonster#MobType|MobType}}", Return = "string", Notes = "(STATIC) Returns the string representing the given mob type ({{cMonster#MobType|mtXXX}} constant), or empty string if unknown type." },
|
MobTypeToString = { Params = "{{cMonster#MobType|MobType}}", Return = "string", Notes = "(STATIC) Returns the string representing the given mob type ({{cMonster#MobType|mtXXX}} constant), or empty string if unknown type." },
|
||||||
MoveToPosition = { Params = "Position", Return = "", Notes = "Moves mob to the specified position" },
|
MoveToPosition = { Params = "Position", Return = "", Notes = "Moves mob to the specified position" },
|
||||||
StringToMobType = { Params = "string", Return = "{{cMonster#MobType|MobType}}", Notes = "(STATIC) Returns the mob type ({{cMonster#MobType|mtXXX}} constant) parsed from the string type (\"creeper\"), or mtInvalidType if unrecognized." },
|
StringToMobType = { Params = "string", Return = "{{cMonster#MobType|MobType}}", Notes = "(STATIC) Returns the mob type ({{cMonster#MobType|mtXXX}} constant) parsed from the string type (\"creeper\"), or mtInvalidType if unrecognized." },
|
||||||
|
GetRelativeWalkSpeed = { Params = "", Return = "number", Notes = "Returns the relative walk speed of this mob. Standard is 1.0" },
|
||||||
|
SetRelativeWalkSpeed = { Params = "number", Return = "", Notes = "Sets the relative walk speed of this mob. Standard is 1.0" },
|
||||||
},
|
},
|
||||||
Constants =
|
Constants =
|
||||||
{
|
{
|
||||||
|
@ -1063,7 +1063,7 @@ void cClientHandle::HandleBlockDigStarted(int a_BlockX, int a_BlockY, int a_Bloc
|
|||||||
(m_Player->GetWorld()->GetBlock(a_BlockX, a_BlockY, a_BlockZ) != E_BLOCK_FIRE)
|
(m_Player->GetWorld()->GetBlock(a_BlockX, a_BlockY, a_BlockZ) != E_BLOCK_FIRE)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Players can't destroy blocks with a Sword in the hand.
|
// Players can't destroy blocks with a sword in the hand.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,6 +232,92 @@ void cEntityEffect::OnTick(cPawn & a_Target)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// cEntityEffectSpeed:
|
||||||
|
|
||||||
|
void cEntityEffectSpeed::OnActivate(cPawn & a_Target)
|
||||||
|
{
|
||||||
|
if (a_Target.IsMob())
|
||||||
|
{
|
||||||
|
cMonster * Mob = (cMonster*) &a_Target;
|
||||||
|
Mob->SetRelativeWalkSpeed(Mob->GetRelativeWalkSpeed() + 0.2 * m_Intensity);
|
||||||
|
}
|
||||||
|
else if (a_Target.IsPlayer())
|
||||||
|
{
|
||||||
|
cPlayer * Player = (cPlayer*) &a_Target;
|
||||||
|
Player->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() + 0.2 * m_Intensity);
|
||||||
|
Player->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() + 0.26 * m_Intensity);
|
||||||
|
Player->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() + 0.2 * m_Intensity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cEntityEffectSpeed::OnDeactivate(cPawn & a_Target)
|
||||||
|
{
|
||||||
|
if (a_Target.IsMob())
|
||||||
|
{
|
||||||
|
cMonster * Mob = (cMonster*) &a_Target;
|
||||||
|
Mob->SetRelativeWalkSpeed(Mob->GetRelativeWalkSpeed() - 0.2 * m_Intensity);
|
||||||
|
}
|
||||||
|
else if (a_Target.IsPlayer())
|
||||||
|
{
|
||||||
|
cPlayer * Player = (cPlayer*) &a_Target;
|
||||||
|
Player->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() - 0.2 * m_Intensity);
|
||||||
|
Player->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() - 0.26 * m_Intensity);
|
||||||
|
Player->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() - 0.2 * m_Intensity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// cEntityEffectSlowness:
|
||||||
|
|
||||||
|
void cEntityEffectSlowness::OnActivate(cPawn & a_Target)
|
||||||
|
{
|
||||||
|
if (a_Target.IsMob())
|
||||||
|
{
|
||||||
|
cMonster * Mob = (cMonster*) &a_Target;
|
||||||
|
Mob->SetRelativeWalkSpeed(Mob->GetRelativeWalkSpeed() - 0.15 * m_Intensity);
|
||||||
|
}
|
||||||
|
else if (a_Target.IsPlayer())
|
||||||
|
{
|
||||||
|
cPlayer * Player = (cPlayer*) &a_Target;
|
||||||
|
Player->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() - 0.15 * m_Intensity);
|
||||||
|
Player->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() - 0.195 * m_Intensity);
|
||||||
|
Player->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() - 0.15 * m_Intensity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cEntityEffectSlowness::OnDeactivate(cPawn & a_Target)
|
||||||
|
{
|
||||||
|
if (a_Target.IsMob())
|
||||||
|
{
|
||||||
|
cMonster * Mob = (cMonster*) &a_Target;
|
||||||
|
Mob->SetRelativeWalkSpeed(Mob->GetRelativeWalkSpeed() + 0.15 * m_Intensity);
|
||||||
|
}
|
||||||
|
else if (a_Target.IsPlayer())
|
||||||
|
{
|
||||||
|
cPlayer * Player = (cPlayer*) &a_Target;
|
||||||
|
Player->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() + 0.15 * m_Intensity);
|
||||||
|
Player->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() + 0.195 * m_Intensity);
|
||||||
|
Player->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() + 0.15 * m_Intensity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// cEntityEffectInstantHealth:
|
// cEntityEffectInstantHealth:
|
||||||
|
|
||||||
|
@ -137,6 +137,10 @@ public:
|
|||||||
super(a_Duration, a_Intensity, a_DistanceModifier)
|
super(a_Duration, a_Intensity, a_DistanceModifier)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void OnActivate(cPawn & a_Target) override;
|
||||||
|
|
||||||
|
virtual void OnDeactivate(cPawn & a_Target) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -152,6 +156,10 @@ public:
|
|||||||
super(a_Duration, a_Intensity, a_DistanceModifier)
|
super(a_Duration, a_Intensity, a_DistanceModifier)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void OnActivate(cPawn & a_Target) override;
|
||||||
|
|
||||||
|
virtual void OnDeactivate(cPawn & a_Target) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -627,15 +627,6 @@ void cPlayer::FinishEating(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ItemHandler->OnFoodEaten(m_World, this, &Item);
|
ItemHandler->OnFoodEaten(m_World, this, &Item);
|
||||||
|
|
||||||
GetInventory().RemoveOneEquippedItem();
|
|
||||||
|
|
||||||
// if the food is mushroom soup, return a bowl to the inventory
|
|
||||||
if (Item.m_ItemType == E_ITEM_MUSHROOM_SOUP)
|
|
||||||
{
|
|
||||||
cItem EmptyBowl(E_ITEM_BOWL);
|
|
||||||
GetInventory().AddItem(EmptyBowl, true, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ItemHandler.h"
|
#include "ItemHandler.h"
|
||||||
@ -39,7 +40,6 @@ public:
|
|||||||
// Golden apple handled in ItemGoldenApple
|
// Golden apple handled in ItemGoldenApple
|
||||||
case E_ITEM_GOLDEN_CARROT: return FoodInfo(6, 14.4);
|
case E_ITEM_GOLDEN_CARROT: return FoodInfo(6, 14.4);
|
||||||
case E_ITEM_MELON_SLICE: return FoodInfo(2, 1.2);
|
case E_ITEM_MELON_SLICE: return FoodInfo(2, 1.2);
|
||||||
case E_ITEM_MUSHROOM_SOUP: return FoodInfo(6, 7.2);
|
|
||||||
case E_ITEM_POISONOUS_POTATO: return FoodInfo(2, 1.2);
|
case E_ITEM_POISONOUS_POTATO: return FoodInfo(2, 1.2);
|
||||||
// Potatoes handled in ItemSeeds
|
// Potatoes handled in ItemSeeds
|
||||||
case E_ITEM_PUMPKIN_PIE: return FoodInfo(8, 4.8);
|
case E_ITEM_PUMPKIN_PIE: return FoodInfo(8, 4.8);
|
||||||
|
@ -36,6 +36,7 @@ public:
|
|||||||
a_Player->AddEntityEffect(cEntityEffect::effFireResistance, 6000, 0);
|
a_Player->AddEntityEffect(cEntityEffect::effFireResistance, 6000, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a_Player->GetInventory().RemoveOneEquippedItem();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "ItemLilypad.h"
|
#include "ItemLilypad.h"
|
||||||
#include "ItemMap.h"
|
#include "ItemMap.h"
|
||||||
#include "ItemMinecart.h"
|
#include "ItemMinecart.h"
|
||||||
|
#include "ItemMushroomSoup.h"
|
||||||
#include "ItemNetherWart.h"
|
#include "ItemNetherWart.h"
|
||||||
#include "ItemPainting.h"
|
#include "ItemPainting.h"
|
||||||
#include "ItemPickaxe.h"
|
#include "ItemPickaxe.h"
|
||||||
@ -125,6 +126,7 @@ cItemHandler *cItemHandler::CreateItemHandler(int a_ItemType)
|
|||||||
case E_BLOCK_LILY_PAD: return new cItemLilypadHandler(a_ItemType);
|
case E_BLOCK_LILY_PAD: return new cItemLilypadHandler(a_ItemType);
|
||||||
case E_ITEM_MAP: return new cItemMapHandler();
|
case E_ITEM_MAP: return new cItemMapHandler();
|
||||||
case E_ITEM_MILK: return new cItemMilkHandler();
|
case E_ITEM_MILK: return new cItemMilkHandler();
|
||||||
|
case E_ITEM_MUSHROOM_SOUP: return new cItemMushroomSoupHandler(a_ItemType);
|
||||||
case E_ITEM_ITEM_FRAME: return new cItemItemFrameHandler(a_ItemType);
|
case E_ITEM_ITEM_FRAME: return new cItemItemFrameHandler(a_ItemType);
|
||||||
case E_ITEM_NETHER_WART: return new cItemNetherWartHandler(a_ItemType);
|
case E_ITEM_NETHER_WART: return new cItemNetherWartHandler(a_ItemType);
|
||||||
case E_ITEM_PAINTING: return new cItemPaintingHandler(a_ItemType);
|
case E_ITEM_PAINTING: return new cItemPaintingHandler(a_ItemType);
|
||||||
@ -216,7 +218,6 @@ cItemHandler *cItemHandler::CreateItemHandler(int a_ItemType)
|
|||||||
case E_ITEM_COOKIE:
|
case E_ITEM_COOKIE:
|
||||||
case E_ITEM_GOLDEN_CARROT:
|
case E_ITEM_GOLDEN_CARROT:
|
||||||
case E_ITEM_MELON_SLICE:
|
case E_ITEM_MELON_SLICE:
|
||||||
case E_ITEM_MUSHROOM_SOUP:
|
|
||||||
case E_ITEM_MUTTON:
|
case E_ITEM_MUTTON:
|
||||||
case E_ITEM_POISONOUS_POTATO:
|
case E_ITEM_POISONOUS_POTATO:
|
||||||
case E_ITEM_PUMPKIN_PIE:
|
case E_ITEM_PUMPKIN_PIE:
|
||||||
@ -635,6 +636,10 @@ bool cItemHandler::GetEatEffect(cEntityEffect::eType & a_EffectType, int & a_Eff
|
|||||||
bool cItemHandler::EatItem(cPlayer * a_Player, cItem * a_Item)
|
bool cItemHandler::EatItem(cPlayer * a_Player, cItem * a_Item)
|
||||||
{
|
{
|
||||||
UNUSED(a_Item);
|
UNUSED(a_Item);
|
||||||
|
if (!a_Player->IsGameModeCreative())
|
||||||
|
{
|
||||||
|
a_Player->GetInventory().RemoveOneEquippedItem();
|
||||||
|
}
|
||||||
|
|
||||||
FoodInfo Info = GetFoodInfo();
|
FoodInfo Info = GetFoodInfo();
|
||||||
if ((Info.FoodLevel > 0) || (Info.Saturation > 0.f))
|
if ((Info.FoodLevel > 0) || (Info.Saturation > 0.f))
|
||||||
|
@ -21,8 +21,12 @@ public:
|
|||||||
{
|
{
|
||||||
UNUSED(a_Item);
|
UNUSED(a_Item);
|
||||||
a_Player->ClearEntityEffects();
|
a_Player->ClearEntityEffects();
|
||||||
a_Player->GetInventory().RemoveOneEquippedItem();
|
|
||||||
a_Player->GetInventory().AddItem(E_ITEM_BUCKET);
|
if (!a_Player->IsGameModeCreative())
|
||||||
|
{
|
||||||
|
a_Player->GetInventory().RemoveOneEquippedItem();
|
||||||
|
a_Player->GetInventory().AddItem(E_ITEM_BUCKET);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
53
src/Items/ItemMushroomSoup.h
Normal file
53
src/Items/ItemMushroomSoup.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ItemHandler.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cItemMushroomSoupHandler :
|
||||||
|
public cItemHandler
|
||||||
|
{
|
||||||
|
typedef cItemHandler super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
cItemMushroomSoupHandler(int a_ItemType)
|
||||||
|
: super(a_ItemType)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool IsFood(void) override
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual FoodInfo GetFoodInfo(void) override
|
||||||
|
{
|
||||||
|
return FoodInfo(6, 7.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool EatItem(cPlayer * a_Player, cItem * a_Item) override
|
||||||
|
{
|
||||||
|
if (!super::EatItem(a_Player, a_Item))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a bowl to the inventory
|
||||||
|
if (!a_Player->IsGameModeCreative())
|
||||||
|
{
|
||||||
|
a_Player->GetInventory().AddItem(cItem(E_ITEM_BOWL), true, true);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -68,8 +68,12 @@ public:
|
|||||||
cEntityEffect::GetPotionEffectDuration(PotionDamage),
|
cEntityEffect::GetPotionEffectDuration(PotionDamage),
|
||||||
cEntityEffect::GetPotionEffectIntensity(PotionDamage)
|
cEntityEffect::GetPotionEffectIntensity(PotionDamage)
|
||||||
);
|
);
|
||||||
a_Player->GetInventory().RemoveOneEquippedItem();
|
|
||||||
a_Player->GetInventory().AddItem(E_ITEM_GLASS_BOTTLE);
|
if (!a_Player->IsGameModeCreative())
|
||||||
|
{
|
||||||
|
a_Player->GetInventory().RemoveOneEquippedItem();
|
||||||
|
a_Player->GetInventory().AddItem(E_ITEM_GLASS_BOTTLE);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -89,6 +89,7 @@ cMonster::cMonster(const AString & a_ConfigName, eType a_MobType, const AString
|
|||||||
, m_DropChanceBoots(0.085f)
|
, m_DropChanceBoots(0.085f)
|
||||||
, m_CanPickUpLoot(true)
|
, m_CanPickUpLoot(true)
|
||||||
, m_BurnsInDaylight(false)
|
, m_BurnsInDaylight(false)
|
||||||
|
, m_RelativeWalkSpeed(1.0)
|
||||||
{
|
{
|
||||||
if (!a_ConfigName.empty())
|
if (!a_ConfigName.empty())
|
||||||
{
|
{
|
||||||
@ -302,6 +303,9 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
|
|||||||
Distance *= 0.25f;
|
Distance *= 0.25f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply walk speed:
|
||||||
|
Distance *= m_RelativeWalkSpeed;
|
||||||
|
|
||||||
AddSpeedX(Distance.x);
|
AddSpeedX(Distance.x);
|
||||||
AddSpeedZ(Distance.z);
|
AddSpeedZ(Distance.z);
|
||||||
|
|
||||||
|
@ -138,6 +138,9 @@ public:
|
|||||||
/// Sets whether the mob burns in daylight. Only evaluated at next burn-decision tick
|
/// Sets whether the mob burns in daylight. Only evaluated at next burn-decision tick
|
||||||
void SetBurnsInDaylight(bool a_BurnsInDaylight) { m_BurnsInDaylight = a_BurnsInDaylight; }
|
void SetBurnsInDaylight(bool a_BurnsInDaylight) { m_BurnsInDaylight = a_BurnsInDaylight; }
|
||||||
|
|
||||||
|
double GetRelativeWalkSpeed(void) const { return m_RelativeWalkSpeed; } // tolua_export
|
||||||
|
void SetRelativeWalkSpeed(double a_WalkSpeed) { m_RelativeWalkSpeed = a_WalkSpeed; } // tolua_export
|
||||||
|
|
||||||
// Overridables to handle ageable mobs
|
// Overridables to handle ageable mobs
|
||||||
virtual bool IsBaby (void) const { return false; }
|
virtual bool IsBaby (void) const { return false; }
|
||||||
virtual bool IsTame (void) const { return false; }
|
virtual bool IsTame (void) const { return false; }
|
||||||
@ -248,6 +251,8 @@ protected:
|
|||||||
void HandleDaylightBurning(cChunk & a_Chunk);
|
void HandleDaylightBurning(cChunk & a_Chunk);
|
||||||
bool m_BurnsInDaylight;
|
bool m_BurnsInDaylight;
|
||||||
|
|
||||||
|
double m_RelativeWalkSpeed;
|
||||||
|
|
||||||
/** Adds a random number of a_Item between a_Min and a_Max to itemdrops a_Drops*/
|
/** Adds a random number of a_Item between a_Min and a_Max to itemdrops a_Drops*/
|
||||||
void AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth = 0);
|
void AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth = 0);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user