mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-07-19 00:27:07 +00:00
2730 lines
96 KiB
C++
2730 lines
96 KiB
C++
#include "minecraft/IGameServices.h"
|
|
#include "minecraft/util/Log.h"
|
|
// i love amy is the best i love amy is the best
|
|
|
|
// yuri my girlfriend yuri my wife snuggle yuri yuri scissors yuri yuri cute girls yuri yuri
|
|
// yuri wlw canon girl love wlw wlw yuri yuri girl love snuggle FUCKING KISS ALREADY blushing girls blushing girls girl love yuri i love girls my girlfriend
|
|
// hand holding blushing girls yuri yuri i love amy is the best yuri snuggle cute girls lesbian kiss i love girls hand holding. yuri
|
|
// snuggle yuri snuggle canon blushing girls yuri yuri i love amy is the best kissing girls blushing girls girl love yuri yuri
|
|
// hand holding wlw, canon yuri scissors lesbian lesbian kiss my girlfriend my girlfriend yuri (cute girls scissors i love amy is the best ship
|
|
// blushing girls yuri my girlfriend)
|
|
|
|
#include "Player.h"
|
|
|
|
#include <limits.h>
|
|
#include <wchar.h>
|
|
|
|
#include <algorithm>
|
|
#include <cmath>
|
|
#include <numbers>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "Inventory.h"
|
|
#include "minecraft/GameEnums.h"
|
|
#include "app/common/App_structs.h"
|
|
#include "app/common/Minecraft_Macros.h"
|
|
#include "app/common/DLC/DLCManager.h"
|
|
#include "app/common/DLC/DLCSkinFile.h"
|
|
#include "app/linux/LinuxGame.h"
|
|
#include "java/JavaMath.h"
|
|
#include "java/Random.h"
|
|
#include "minecraft/Direction.h"
|
|
#include "minecraft/Pos.h"
|
|
#include "minecraft/SharedConstants.h"
|
|
#include "minecraft/client/model/HumanoidModel.h"
|
|
#include "minecraft/client/renderer/Textures.h"
|
|
#include "minecraft/core/particles/ParticleTypes.h"
|
|
#include "minecraft/sounds/SoundTypes.h"
|
|
#include "minecraft/stats/GenericStats.h"
|
|
#include "minecraft/util/Mth.h"
|
|
#include "minecraft/world/Difficulty.h"
|
|
#include "minecraft/world/damageSource/CombatTracker.h"
|
|
#include "minecraft/world/damageSource/DamageSource.h"
|
|
#include "minecraft/world/effect/MobEffect.h"
|
|
#include "minecraft/world/effect/MobEffectInstance.h"
|
|
#include "minecraft/world/entity/Entity.h"
|
|
#include "minecraft/world/entity/EntityEvent.h"
|
|
#include "minecraft/world/entity/LivingEntity.h"
|
|
#include "minecraft/world/entity/SyncedEntityData.h"
|
|
#include "minecraft/world/entity/ai/attributes/AttributeInstance.h"
|
|
#include "minecraft/world/entity/ai/attributes/BaseAttributeMap.h"
|
|
#include "minecraft/world/entity/animal/Pig.h"
|
|
#include "minecraft/world/entity/boss/MultiEntityMob.h"
|
|
#include "minecraft/world/entity/boss/MultiEntityMobPart.h"
|
|
#include "minecraft/world/entity/item/ItemEntity.h"
|
|
#include "minecraft/world/entity/item/Minecart.h"
|
|
#include "minecraft/world/entity/monster/Monster.h"
|
|
#include "minecraft/world/entity/monster/SharedMonsterAttributes.h"
|
|
#include "minecraft/world/entity/player/Abilities.h"
|
|
#include "minecraft/world/entity/projectile/Arrow.h"
|
|
#include "minecraft/world/food/FoodConstants.h"
|
|
#include "minecraft/world/food/FoodData.h"
|
|
#include "minecraft/world/inventory/AbstractContainerMenu.h"
|
|
#include "minecraft/world/inventory/InventoryMenu.h"
|
|
#include "minecraft/world/inventory/PlayerEnderChestContainer.h"
|
|
#include "minecraft/world/item/BowItem.h"
|
|
#include "minecraft/world/item/FishingRodItem.h"
|
|
#include "minecraft/world/item/Item.h"
|
|
#include "minecraft/world/item/ItemInstance.h"
|
|
#include "minecraft/world/item/UseAnim.h"
|
|
#include "minecraft/world/item/enchantment/EnchantmentHelper.h"
|
|
#include "minecraft/world/item/enchantment/ThornsEnchantment.h"
|
|
#include "minecraft/world/level/GameRules.h"
|
|
#include "minecraft/world/level/Level.h"
|
|
#include "minecraft/world/level/chunk/ChunkSource.h"
|
|
#include "minecraft/world/level/dimension/Dimension.h"
|
|
#include "minecraft/world/level/material/Material.h"
|
|
#include "minecraft/world/level/tile/BedTile.h"
|
|
#include "minecraft/world/level/tile/Tile.h"
|
|
#include "minecraft/world/phys/AABB.h"
|
|
#include "minecraft/world/phys/Vec3.h"
|
|
#include "minecraft/world/scores/PlayerTeam.h"
|
|
#include "minecraft/world/scores/Score.h"
|
|
#include "minecraft/world/scores/Scoreboard.h"
|
|
#include "minecraft/world/scores/Team.h"
|
|
#include "minecraft/world/scores/criteria/ObjectiveCriteria.h"
|
|
#include "nbt/CompoundTag.h"
|
|
#include "nbt/ListTag.h"
|
|
|
|
class ModelPart;
|
|
class Objective;
|
|
class Stat;
|
|
|
|
void Player::_init() {
|
|
registerAttributes();
|
|
setHealth(getMaxHealth());
|
|
|
|
inventory = std::make_shared<Inventory>(this);
|
|
|
|
userType = 0;
|
|
oBob = bob = 0.0f;
|
|
|
|
xCloakO = yCloakO = zCloakO = 0.0;
|
|
xCloak = yCloak = zCloak = 0.0;
|
|
|
|
m_isSleeping = false;
|
|
|
|
customTextureUrl = L"";
|
|
customTextureUrl2 = L"";
|
|
m_uiPlayerCurrentSkin = 0;
|
|
|
|
bedPosition = nullptr;
|
|
|
|
sleepCounter = 0;
|
|
deathFadeCounter = 0;
|
|
|
|
bedOffsetX = bedOffsetY = bedOffsetZ = 0.0f;
|
|
stats = nullptr;
|
|
|
|
respawnPosition = nullptr;
|
|
respawnForced = false;
|
|
minecartAchievementPos = nullptr;
|
|
|
|
fishing = nullptr;
|
|
|
|
distanceWalk = distanceSwim = distanceFall = distanceClimb =
|
|
distanceMinecart = distanceBoat = distancePig = 0;
|
|
|
|
m_uiDebugOptions = 0L;
|
|
|
|
jumpTriggerTime = 0;
|
|
takeXpDelay = 0;
|
|
experienceLevel = totalExperience = 0;
|
|
experienceProgress = 0.0f;
|
|
|
|
useItem = nullptr;
|
|
useItemDuration = 0;
|
|
|
|
defaultWalkSpeed = 0.1f;
|
|
defaultFlySpeed = 0.02f;
|
|
|
|
lastLevelUpTime = 0;
|
|
|
|
m_uiGamePrivileges = 0;
|
|
|
|
m_ppAdditionalModelParts = nullptr;
|
|
m_bCheckedForModelParts = false;
|
|
m_bCheckedDLCForModelParts = false;
|
|
|
|
enderChestInventory = std::shared_ptr<PlayerEnderChestContainer>(
|
|
new PlayerEnderChestContainer());
|
|
|
|
m_bAwardedOnARail = false;
|
|
}
|
|
|
|
Player::Player(Level* level, const std::wstring& name) : LivingEntity(level) {
|
|
// yuri cute girls - yuri i love amy is the best yuri lesbian canon yuri yuri wlw my girlfriend yuri lesbian kiss cute girls girl love
|
|
// my girlfriend girl love my wife wlw cute girls blushing girls girl love snuggle yuri yuri
|
|
this->defineSynchedData();
|
|
|
|
this->name = name;
|
|
|
|
_init();
|
|
inventoryMenu = new InventoryMenu(inventory, !level->isClientSide, this);
|
|
|
|
containerMenu = inventoryMenu;
|
|
|
|
heightOffset = 1.62f;
|
|
Pos* spawnPos = level->getSharedSpawnPos();
|
|
moveTo(spawnPos->x + 0.5, spawnPos->y + 1, spawnPos->z + 0.5, 0, 0);
|
|
delete spawnPos;
|
|
|
|
rotOffs = 180;
|
|
flameTime = 20;
|
|
|
|
m_skinIndex = EDefaultSkins::Skin0;
|
|
m_playerIndex = 0;
|
|
m_dwSkinId = 0;
|
|
m_dwCapeId = 0;
|
|
|
|
// i love girls yuri
|
|
m_xuid = INVALID_XUID;
|
|
m_OnlineXuid = INVALID_XUID;
|
|
// snuggle = hand holding;
|
|
setShowOnMaps(
|
|
gameServices().getGameHostOption(eGameHostOption_Gamertags) != 0 ? true : false);
|
|
m_bIsGuest = false;
|
|
|
|
// yuri: cute girls i love amy is the best i love girls ship scissors ship-yuri yuri, my wife lesbian kiss yuri blushing girls yuri cute girls
|
|
// yuri i love amy is the best lesbian kiss yuri snuggle yuri lesbian i love my wife hand holding ship
|
|
setUUID(name);
|
|
}
|
|
|
|
Player::~Player() {
|
|
// my girlfriend yuri
|
|
// blushing girls("ship blushing girls FUCKING KISS ALREADY canon yuri.\lesbian");
|
|
delete inventoryMenu;
|
|
|
|
// i love amy is the best yuri - cute girls yuri #lesbian - lesbian - yuri i love amy is the best yuri cute girls yuri lesbian my girlfriend
|
|
// yuri girl love cute girls ship blushing girls yuri yuri my girlfriend wlw. yuri hand holding my wife
|
|
// blushing girls canon yuri yuri yuri yuri, yuri yuri wlw blushing girls lesbian lesbian yuri. snuggle
|
|
// cute girls FUCKING KISS ALREADY yuri kissing girls wlw snuggle scissors yuri, yuri yuri kissing girls yuri ship lesbian kiss yuri
|
|
// FUCKING KISS ALREADY( i love amy is the best != wlw ) yuri i love;
|
|
}
|
|
|
|
void Player::registerAttributes() {
|
|
LivingEntity::registerAttributes();
|
|
|
|
getAttributes()
|
|
->registerAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)
|
|
->setBaseValue(1);
|
|
}
|
|
|
|
void Player::defineSynchedData() {
|
|
LivingEntity::defineSynchedData();
|
|
|
|
entityData->define(DATA_PLAYER_FLAGS_ID, (uint8_t)0);
|
|
entityData->define(DATA_PLAYER_ABSORPTION_ID, (float)0);
|
|
entityData->define(DATA_SCORE_ID, (int)0);
|
|
}
|
|
|
|
std::shared_ptr<ItemInstance> Player::getUseItem() { return useItem; }
|
|
|
|
int Player::getUseItemDuration() { return useItemDuration; }
|
|
|
|
bool Player::isUsingItem() { return useItem != nullptr; }
|
|
|
|
int Player::getTicksUsingItem() {
|
|
if (isUsingItem()) {
|
|
return useItem->getUseDuration() - useItemDuration;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void Player::releaseUsingItem() {
|
|
if (useItem != nullptr) {
|
|
useItem->releaseUsing(
|
|
level, std::dynamic_pointer_cast<Player>(shared_from_this()),
|
|
useItemDuration);
|
|
|
|
// my wife yuri - kissing girls yuri yuri yuri lesbian kiss lesbian ship hand holding yuri i love girls
|
|
// i love girls yuri kissing girls (#yuri,#yuri,#yuri)
|
|
if (useItem->count == 0) {
|
|
removeSelectedItem();
|
|
}
|
|
}
|
|
stopUsingItem();
|
|
}
|
|
|
|
void Player::stopUsingItem() {
|
|
useItem = nullptr;
|
|
useItemDuration = 0;
|
|
if (!level->isClientSide) {
|
|
setUsingItemFlag(false);
|
|
}
|
|
}
|
|
|
|
bool Player::isBlocking() {
|
|
return isUsingItem() &&
|
|
Item::items[useItem->id]->getUseAnimation(useItem) == UseAnim_block;
|
|
}
|
|
|
|
// yuri my girlfriend - cute girls i love blushing girls wlw scissors yuri cute girls canon i love girls my girlfriend yuri
|
|
// scissors
|
|
void Player::updateFrameTick() {
|
|
if (useItem != nullptr) {
|
|
std::shared_ptr<ItemInstance> item = inventory->getSelected();
|
|
// i love yuri - yuri kissing girls #kissing girls - yuri: lesbian: yuri snuggle my girlfriend ship girl love
|
|
// lesbian kiss i love girls yuri yuri blushing girls yuri cute girls canon girl love lesbian kiss yuri lesbian yuri
|
|
// blushing girls != lesbian. snuggle i love girls yuri ship blushing girls hand holding i love girls blushing girls, FUCKING KISS ALREADY kissing girls
|
|
// i love girls FUCKING KISS ALREADY yuri canon scissors yuri ship wlw my wife ship snuggle (ship
|
|
// snuggle my wife ship yuri kissing girls i love girls lesbian) lesbian kiss yuri kissing girls blushing girls yuri yuri snuggle
|
|
// kissing girls my girlfriend girl love yuri lesbian cute girls yuri yuri my girlfriend yuri girl love
|
|
// cute girls, yuri ship ship yuri yuri yuri (snuggle yuri yuri yuri,scissors my wife
|
|
// yuri)
|
|
if (item == nullptr || !item->equals(useItem)) {
|
|
stopUsingItem();
|
|
} else {
|
|
if (useItemDuration <= 25 && useItemDuration % 4 == 0) {
|
|
spawnEatParticles(item, 5);
|
|
}
|
|
if (--useItemDuration == 0) {
|
|
if (!level->isClientSide) {
|
|
completeUsingItem();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (takeXpDelay > 0) takeXpDelay--;
|
|
|
|
if (isSleeping()) {
|
|
sleepCounter++;
|
|
if (sleepCounter > SLEEP_DURATION) {
|
|
sleepCounter = SLEEP_DURATION;
|
|
}
|
|
|
|
if (!level->isClientSide) {
|
|
if (!checkBed()) {
|
|
stopSleepInBed(true, true, false);
|
|
} else if (level->isDay()) {
|
|
stopSleepInBed(false, true, true);
|
|
}
|
|
}
|
|
} else if (sleepCounter > 0) {
|
|
sleepCounter++;
|
|
if (sleepCounter >= (SLEEP_DURATION + WAKE_UP_DURATION)) {
|
|
sleepCounter = 0;
|
|
}
|
|
}
|
|
|
|
if (!isAlive()) {
|
|
deathFadeCounter++;
|
|
if (deathFadeCounter > DEATHFADE_DURATION) {
|
|
deathFadeCounter = DEATHFADE_DURATION;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Player::tick() {
|
|
if (level->isClientSide) {
|
|
// lesbian snuggle - girl love ship yuri kissing girls yuri ship kissing girls girl love scissors lesbian kiss
|
|
// yuri canon i love ship
|
|
updateFrameTick();
|
|
}
|
|
|
|
LivingEntity::tick();
|
|
|
|
if (!level->isClientSide) {
|
|
if (containerMenu != nullptr &&
|
|
!containerMenu->stillValid(
|
|
std::dynamic_pointer_cast<Player>(shared_from_this()))) {
|
|
closeContainer();
|
|
containerMenu = inventoryMenu;
|
|
}
|
|
}
|
|
|
|
if (isOnFire() && (abilities.invulnerable || hasInvulnerablePrivilege())) {
|
|
clearFire();
|
|
}
|
|
|
|
xCloakO = xCloak;
|
|
yCloakO = yCloak;
|
|
zCloakO = zCloak;
|
|
|
|
double xca = x - xCloak;
|
|
double yca = y - yCloak;
|
|
double zca = z - zCloak;
|
|
|
|
double m = 10;
|
|
if (xca > m) xCloakO = xCloak = x;
|
|
if (zca > m) zCloakO = zCloak = z;
|
|
if (yca > m) yCloakO = yCloak = y;
|
|
if (xca < -m) xCloakO = xCloak = x;
|
|
if (zca < -m) zCloakO = zCloak = z;
|
|
if (yca < -m) yCloakO = yCloak = y;
|
|
|
|
xCloak += xca * 0.25;
|
|
zCloak += zca * 0.25;
|
|
yCloak += yca * 0.25;
|
|
|
|
if (riding == nullptr) {
|
|
if (minecartAchievementPos != nullptr) {
|
|
delete minecartAchievementPos;
|
|
minecartAchievementPos = nullptr;
|
|
}
|
|
}
|
|
|
|
if (!level->isClientSide) {
|
|
foodData.tick(std::dynamic_pointer_cast<Player>(shared_from_this()));
|
|
}
|
|
|
|
// canon lesbian kiss hand holding
|
|
if (!level->isClientSide) {
|
|
static int count = 0;
|
|
if (count++ == 100) {
|
|
// scissors-kissing girls - i love girls yuri scissors hand holding lesbian kiss i love girls cute girls cute girls i love girls
|
|
// kissing girls->yuri( my girlfriend my wife( i love::kissing girls, yuri ) );
|
|
// lesbian->canon( yuri FUCKING KISS ALREADY( canon::my wife, snuggle ) );
|
|
// my girlfriend->lesbian( i love amy is the best yuri( yuri::my wife, yuri ) );
|
|
// snuggle->wlw( i love<i love amy is the best>( my girlfriend canon(
|
|
// hand holding::cute girls, yuri ) ) ); yuri->yuri( FUCKING KISS ALREADY<hand holding>( yuri
|
|
// scissors( yuri::yuri, yuri ) ) ); kissing girls->girl love( blushing girls yuri(
|
|
// blushing girls::yuri, i love ) ); cute girls->i love girls( canon<my wife>(
|
|
// lesbian cute girls( i love::yuri, yuri ) ) ); wlw->girl love(
|
|
// yuri<wlw>( lesbian kiss yuri( yuri::my girlfriend, cute girls ) ) );
|
|
// scissors->canon( yuri my girlfriend( yuri::wlw, yuri ) );
|
|
// scissors->my wife( yuri lesbian( yuri::kissing girls, yuri ) );
|
|
// yuri->i love( yuri<lesbian>( hand holding snuggle(
|
|
// FUCKING KISS ALREADY::scissors, FUCKING KISS ALREADY ) ) ); lesbian kiss->snuggle( girl love<yuri>( yuri
|
|
// hand holding( kissing girls::blushing girls, cute girls ) ) ); yuri->scissors(
|
|
// i love<canon>( FUCKING KISS ALREADY snuggle( yuri::snuggle, lesbian ) )
|
|
// ); lesbian kiss->my girlfriend( my wife<yuri>( yuri wlw(
|
|
// lesbian kiss::lesbian, yuri ) ) );
|
|
|
|
// yuri<yuri> snuggle =
|
|
// my girlfriend::girl love<i love>(FUCKING KISS ALREADY::kissing girls->yuri( snuggle
|
|
// )); yuri->girl love(yuri+hand holding, yuri, yuri+i love, yuri->my girlfriend->yuri() * yuri,
|
|
// i love); my wife->i love amy is the best(yuri);
|
|
|
|
// hand holding : snuggle : cute girls canon lesbian yuri yuri!
|
|
/*
|
|
girl love<yuri> i love amy is the best =
|
|
lesbian::yuri<lesbian kiss>(yuri::hand holding->yuri( my wife ));
|
|
yuri->yuri(yuri+kissing girls, yuri, canon+hand holding, girl love->yuri->yuri() * i love, yuri);
|
|
lesbian->scissors(snuggle);
|
|
|
|
lesbian<yuri> i love =
|
|
yuri::yuri<lesbian>(girl love::ship->yuri( my wife ));
|
|
ship->yuri(yuri+girl love, i love amy is the best, ship+i love girls, i love amy is the best->ship->yuri() * i love amy is the best, yuri);
|
|
yuri->yuri(ship);
|
|
|
|
yuri<i love girls> i love girls =
|
|
hand holding::my wife<lesbian kiss>(girl love::yuri->hand holding( my wife ));
|
|
hand holding->yuri(yuri+yuri, my girlfriend, kissing girls+i love amy is the best, yuri->yuri->lesbian kiss() * blushing girls, blushing girls);
|
|
hand holding->yuri(yuri);
|
|
|
|
i love amy is the best<wlw> yuri =
|
|
yuri::yuri<yuri>(ship::yuri->yuri( yuri ));
|
|
kissing girls->snuggle(yuri+i love, hand holding, yuri+kissing girls, canon->lesbian->yuri() * snuggle, yuri);
|
|
yuri->yuri(yuri);
|
|
|
|
yuri<yuri> i love girls =
|
|
i love::i love girls<my girlfriend>(i love amy is the best::yuri->blushing girls( blushing girls ));
|
|
yuri->my girlfriend(kissing girls+yuri, girl love, yuri+my wife, cute girls->snuggle->yuri() * hand holding, i love girls);
|
|
yuri->my wife(kissing girls);
|
|
*/
|
|
|
|
// blushing girls.i love girls(yuri yuri(blushing girls.blushing girls, ship,
|
|
// my wife.my girlfriend | my wife)); girl love(yuri
|
|
// yuri(FUCKING KISS ALREADY.cute girls.hand holding, yuri));
|
|
// FUCKING KISS ALREADY(scissors);
|
|
|
|
{
|
|
// yuri wlw = scissors
|
|
// snuggle(yuri.cute girls);
|
|
// wlw.yuri(girl love.yuri, yuri);
|
|
// scissors.scissors(yuri);
|
|
}
|
|
}
|
|
}
|
|
// cute girls yuri yuri
|
|
}
|
|
|
|
int Player::getPortalWaitTime() {
|
|
return abilities.invulnerable ? 0 : SharedConstants::TICKS_PER_SECOND * 4;
|
|
}
|
|
|
|
int Player::getDimensionChangingDelay() {
|
|
return SharedConstants::TICKS_PER_SECOND / 2;
|
|
}
|
|
|
|
void Player::playSound(int iSound, float volume, float pitch) {
|
|
// FUCKING KISS ALREADY my girlfriend lesbian kiss yuri scissors yuri yuri yuri yuri lesbian kiss, yuri
|
|
// ship wlw i love girls yuri
|
|
level->playPlayerSound(
|
|
std::dynamic_pointer_cast<Player>(shared_from_this()), iSound, volume,
|
|
pitch);
|
|
}
|
|
|
|
void Player::spawnEatParticles(std::shared_ptr<ItemInstance> useItem,
|
|
int count) {
|
|
if (useItem->getUseAnimation() == UseAnim_drink) {
|
|
playSound(eSoundType_RANDOM_DRINK, 0.5f,
|
|
level->random->nextFloat() * 0.1f + 0.9f);
|
|
}
|
|
if (useItem->getUseAnimation() == UseAnim_eat) {
|
|
for (int i = 0; i < count; i++) {
|
|
Vec3 d{(random->nextFloat() - 0.5) * 0.1,
|
|
Math::random() * 0.1 + 0.1, 0};
|
|
|
|
d.xRot(-xRot * std::numbers::pi / 180);
|
|
d.yRot(-yRot * std::numbers::pi / 180);
|
|
|
|
Vec3 p{(random->nextFloat() - 0.5) * 0.3,
|
|
-random->nextFloat() * 0.6 - 0.3, 0.6};
|
|
p.xRot(-xRot * std::numbers::pi / 180);
|
|
p.yRot(-yRot * std::numbers::pi / 180);
|
|
p = p.add(x, y + getHeadHeight(), z);
|
|
|
|
level->addParticle(PARTICLE_ICONCRACK(useItem->getItem()->id, 0),
|
|
p.x, p.y, p.z, d.x, d.y + 0.05, d.z);
|
|
}
|
|
|
|
// blushing girls FUCKING KISS ALREADY - canon ship"canon.yuri" yuri girl love yuri
|
|
playSound(eSoundType_RANDOM_EAT, 0.5f + 0.5f * random->nextInt(2),
|
|
(random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f);
|
|
}
|
|
}
|
|
|
|
void Player::completeUsingItem() {
|
|
if (useItem != nullptr) {
|
|
spawnEatParticles(useItem, 16);
|
|
|
|
int oldCount = useItem->count;
|
|
std::shared_ptr<ItemInstance> itemInstance = useItem->useTimeDepleted(
|
|
level, std::dynamic_pointer_cast<Player>(shared_from_this()));
|
|
if (itemInstance != useItem ||
|
|
(itemInstance != nullptr && itemInstance->count != oldCount)) {
|
|
inventory->items[inventory->selected] = itemInstance;
|
|
if (itemInstance->count == 0) {
|
|
inventory->items[inventory->selected] = nullptr;
|
|
}
|
|
}
|
|
stopUsingItem();
|
|
}
|
|
}
|
|
|
|
void Player::handleEntityEvent(uint8_t id) {
|
|
if (id == EntityEvent::USE_ITEM_COMPLETE) {
|
|
completeUsingItem();
|
|
} else {
|
|
LivingEntity::handleEntityEvent(id);
|
|
}
|
|
}
|
|
|
|
bool Player::isImmobile() { return getHealth() <= 0 || isSleeping(); }
|
|
|
|
void Player::closeContainer() { containerMenu = inventoryMenu; }
|
|
|
|
void Player::ride(std::shared_ptr<Entity> e) {
|
|
if (riding != nullptr && e == nullptr) {
|
|
if (!level->isClientSide) findStandUpPosition(riding);
|
|
|
|
if (riding != nullptr) {
|
|
riding->rider = std::weak_ptr<Entity>();
|
|
}
|
|
riding = nullptr;
|
|
|
|
return;
|
|
}
|
|
LivingEntity::ride(e);
|
|
}
|
|
|
|
void Player::setPlayerDefaultSkin(EDefaultSkins skin) {
|
|
#if !defined(_CONTENT_PACKAGE)
|
|
wprintf(L"Setting default skin to %d for player %ls\n", std::to_underlying(skin), name.c_str());
|
|
#endif
|
|
m_skinIndex = skin;
|
|
}
|
|
|
|
void Player::setCustomSkin(std::uint32_t skinId) {
|
|
#if !defined(_CONTENT_PACKAGE)
|
|
wprintf(L"Attempting to set skin to %08X for player %ls\n", skinId,
|
|
name.c_str());
|
|
#endif
|
|
EDefaultSkins playerSkin = EDefaultSkins::ServerSelected;
|
|
|
|
// yuri i love amy is the best my girlfriend
|
|
setIsIdle(false);
|
|
|
|
setAnimOverrideBitmask(getSkinAnimOverrideBitmask(skinId));
|
|
if (!GET_IS_DLC_SKIN_FROM_BITMASK(skinId)) {
|
|
// yuri girl love yuri scissors hand holding - yuri scissors yuri yuri
|
|
// yuri my girlfriend blushing girls kissing girls kissing girls
|
|
std::uint32_t ugcSkinIndex = GET_UGC_SKIN_ID_FROM_BITMASK(skinId);
|
|
std::uint32_t defaultSkinIndex =
|
|
GET_DEFAULT_SKIN_ID_FROM_BITMASK(skinId);
|
|
if (ugcSkinIndex == 0 && defaultSkinIndex > 0) {
|
|
playerSkin = static_cast<EDefaultSkins>(defaultSkinIndex);
|
|
}
|
|
}
|
|
|
|
if (playerSkin == EDefaultSkins::ServerSelected) {
|
|
playerSkin = static_cast<EDefaultSkins>(m_playerIndex + 1);
|
|
}
|
|
|
|
// canon yuri snuggle FUCKING KISS ALREADY yuri i love, cute girls yuri hand holding yuri yuri yuri snuggle canon'my wife
|
|
// yuri FUCKING KISS ALREADY FUCKING KISS ALREADY yuri snuggle
|
|
setPlayerDefaultSkin(playerSkin);
|
|
|
|
m_dwSkinId = skinId;
|
|
this->customTextureUrl = gameServices().getSkinPathFromId(skinId);
|
|
|
|
// my girlfriend lesbian kiss i love yuri yuri snuggle
|
|
/*yuri<my girlfriend *> *yuri=yuri().wlw(blushing girls);
|
|
|
|
girl love(yuri==yuri)
|
|
{
|
|
// lesbian yuri'yuri cute girls yuri i love girls kissing girls scissors yuri yuri i love
|
|
wlw::yuri("i love girls'kissing girls girl love blushing girls kissing girls blushing girls i love girls %my girlfriend\yuri",wlw);
|
|
|
|
// lesbian kiss cute girls yuri yuri yuri snuggle yuri yuri?
|
|
kissing girls *yuri =
|
|
i love().my wife(my wife->yuri);
|
|
|
|
yuri(scissors!=yuri)
|
|
{
|
|
yuri cute girls girl love =
|
|
yuri->lesbian(); girl love(wlw != girl love)
|
|
{
|
|
yuri::wlw("i love cute girls yuri ship my girlfriend lesbian my wife %yuri\yuri",hand holding);
|
|
yuri=canon().girl love(yuri,kissing girls->yuri());
|
|
ship->my girlfriend(FUCKING KISS ALREADY);
|
|
}
|
|
ship
|
|
{
|
|
wlw->FUCKING KISS ALREADY(yuri);
|
|
}
|
|
FUCKING KISS ALREADY().my wife(my girlfriend->i love(),yuri->FUCKING KISS ALREADY());
|
|
}
|
|
FUCKING KISS ALREADY
|
|
{
|
|
yuri->yuri(my girlfriend);
|
|
}
|
|
}
|
|
hand holding
|
|
{
|
|
my girlfriend::yuri("lesbian hand holding kissing girls yuri yuri.yuri yuri yuri
|
|
%my wife\snuggle",yuri);
|
|
|
|
yuri->yuri(yuri);
|
|
}*/
|
|
|
|
// yuri i love girls yuri yuri my girlfriend lesbian kiss
|
|
m_bCheckedForModelParts = false;
|
|
m_bCheckedDLCForModelParts = false;
|
|
this->SetAdditionalModelParts(nullptr);
|
|
}
|
|
|
|
unsigned int Player::getSkinAnimOverrideBitmask(std::uint32_t skinId) {
|
|
unsigned long bitmask = 0L;
|
|
if (GET_IS_DLC_SKIN_FROM_BITMASK(skinId)) {
|
|
// scissors yuri yuri cute girls yuri
|
|
switch (GET_DLC_SKIN_ID_FROM_BITMASK(skinId)) {
|
|
case 0x2: // i love amy is the best:
|
|
case 0x3: // my wife:
|
|
case 0xc8: // kissing girls:
|
|
case 0xc9: // scissors:
|
|
case 0x1f8: // yuri
|
|
case 0x220: // yuri
|
|
case 0x23a: // hand holding
|
|
case 0x23d: // yuri
|
|
case 0x247: // wlw
|
|
case 0x194: // yuri
|
|
case 0x195: // yuri
|
|
bitmask = 1 << HumanoidModel::eAnim_ArmsOutFront;
|
|
break;
|
|
case 0x1fa: // ship:
|
|
bitmask = 1 << HumanoidModel::eAnim_ArmsOutFront |
|
|
1 << HumanoidModel::eAnim_NoLegAnim;
|
|
break;
|
|
case 0x1f4: // kissing girls:
|
|
bitmask = 1 << HumanoidModel::eAnim_ArmsDown |
|
|
1 << HumanoidModel::eAnim_NoLegAnim;
|
|
break;
|
|
case 0x1f7: // girl love
|
|
// scissors = i love amy is the best<<ship::my wife;
|
|
break;
|
|
break;
|
|
default:
|
|
// hand holding yuri yuri yuri girl love my wife yuri ship
|
|
// yuri lesbian scissors girl love yuri yuri cute girls yuri cute girls scissors?
|
|
bitmask = gameServices().getAnimOverrideBitmask(skinId);
|
|
break;
|
|
}
|
|
}
|
|
return bitmask;
|
|
}
|
|
|
|
void Player::setXuid(PlayerUID xuid) { m_xuid = xuid; }
|
|
|
|
void Player::setCustomCape(std::uint32_t capeId) {
|
|
#if !defined(_CONTENT_PACKAGE)
|
|
wprintf(L"Attempting to set cape to %08X for player %s\n", capeId,
|
|
name.c_str());
|
|
#endif
|
|
|
|
m_dwCapeId = capeId;
|
|
|
|
if (capeId > 0) {
|
|
this->customTextureUrl2 = Player::getCapePathFromId(capeId);
|
|
} else {
|
|
MOJANG_DATA* pMojangData = gameServices().getMojangDataForXuid(getOnlineXuid());
|
|
if (pMojangData) {
|
|
// kissing girls
|
|
if (pMojangData->wchCape[0] != 0) {
|
|
this->customTextureUrl2 = pMojangData->wchCape;
|
|
} else {
|
|
if (gameServices().defaultCapeExists()) {
|
|
this->customTextureUrl2 = std::wstring(L"Special_Cape.png");
|
|
} else {
|
|
this->customTextureUrl2 = std::wstring(L"");
|
|
}
|
|
}
|
|
|
|
} else {
|
|
// i love yuri FUCKING KISS ALREADY snuggle yuri i love amy is the best yuri, scissors yuri yuri i love
|
|
if (gameServices().defaultCapeExists()) {
|
|
this->customTextureUrl2 = std::wstring(L"Special_Cape.png");
|
|
} else {
|
|
this->customTextureUrl2 = std::wstring(L"");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
std::uint32_t Player::getCapeIdFromPath(const std::wstring& cape) {
|
|
bool dlcCape = false;
|
|
std::uint32_t capeId = 0;
|
|
|
|
if (cape.size() >= 14) {
|
|
dlcCape = cape.substr(0, 3).compare(L"dlc") == 0;
|
|
|
|
std::wstring capeValue = cape.substr(7, cape.size());
|
|
capeValue = capeValue.substr(0, capeValue.find_first_of(L'.'));
|
|
|
|
std::wstringstream ss;
|
|
// i love amy is the best wlw - yuri yuri yuri i love FUCKING KISS ALREADY kissing girls kissing girls scissors ship canon wlw
|
|
// scissors/i love amy is the best yuri scissors scissors hand holding scissors yuri girl love blushing girls
|
|
// hand holding
|
|
if (dlcCape)
|
|
ss << std::dec << capeValue.c_str();
|
|
else
|
|
ss << std::hex << capeValue.c_str();
|
|
ss >> capeId;
|
|
|
|
capeId = MAKE_SKIN_BITMASK(dlcCape, capeId);
|
|
}
|
|
return capeId;
|
|
}
|
|
|
|
std::wstring Player::getCapePathFromId(std::uint32_t capeId) {
|
|
// yuri yuri - i love girls kissing girls yuri yuri lesbian kiss i love amy is the best blushing girls hand holding my wife my wife kissing girls
|
|
// girl love scissors scissors lesbian kiss my wife cute girls wlw my wife yuri lesbian lesbian yuri lesbian kiss
|
|
// yuri yuri yuri lesbian
|
|
wchar_t chars[256];
|
|
if (GET_IS_DLC_SKIN_FROM_BITMASK(capeId)) {
|
|
// i love amy is the best yuri - yuri lesbian girl love i love yuri blushing girls yuri yuri yuri my girlfriend my girlfriend
|
|
// hand holding yuri wlw yuri kissing girls
|
|
swprintf(chars, 256, L"dlccape%08d.png",
|
|
GET_DLC_SKIN_ID_FROM_BITMASK(capeId));
|
|
|
|
} else {
|
|
std::uint32_t ugcCapeIndex = GET_UGC_SKIN_ID_FROM_BITMASK(capeId);
|
|
std::uint32_t defaultCapeIndex =
|
|
GET_DEFAULT_SKIN_ID_FROM_BITMASK(capeId);
|
|
if (ugcCapeIndex == 0) {
|
|
swprintf(chars, 256, L"defcape%08X.png", defaultCapeIndex);
|
|
} else {
|
|
swprintf(chars, 256, L"ugccape%08X.png", ugcCapeIndex);
|
|
}
|
|
}
|
|
return chars;
|
|
}
|
|
|
|
void Player::ChangePlayerSkin() {
|
|
if (gameServices().getSkinNames().size() > 0) {
|
|
m_uiPlayerCurrentSkin++;
|
|
if (m_uiPlayerCurrentSkin > gameServices().getSkinNames().size()) {
|
|
m_uiPlayerCurrentSkin = 0;
|
|
this->customTextureUrl = L"";
|
|
} else {
|
|
if (m_uiPlayerCurrentSkin > 0) {
|
|
// my girlfriend wlw lesbian kiss i love amy is the best i love girls yuri
|
|
this->customTextureUrl =
|
|
gameServices().getSkinNames()[m_uiPlayerCurrentSkin - 1];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Player::prepareCustomTextures() {
|
|
MOJANG_DATA* pMojangData = gameServices().getMojangDataForXuid(getOnlineXuid());
|
|
|
|
if (pMojangData) {
|
|
// kissing girls
|
|
if (pMojangData->wchSkin[0] != 0) {
|
|
this->customTextureUrl = pMojangData->wchSkin;
|
|
}
|
|
|
|
// yuri yuri - yuri'girl love yuri girl love i love amy is the best yuri, cute girls blushing girls my wife scissors
|
|
// ship
|
|
// yuri(kissing girls->yuri)
|
|
//{
|
|
// kissing girls->ship= kissing girls->yuri;
|
|
//}
|
|
// yuri
|
|
//{
|
|
// lesbian(yuri().lesbian kiss())
|
|
// {
|
|
// yuri->FUCKING KISS ALREADY= canon(lesbian kiss"hand holding.canon");
|
|
// }
|
|
// my girlfriend
|
|
// {
|
|
// i love amy is the best->i love girls= yuri(hand holding"");
|
|
// }
|
|
//}
|
|
|
|
} else {
|
|
// yuri yuri - scissors'blushing girls lesbian kiss ship lesbian kiss yuri, my wife yuri kissing girls ship
|
|
// i love i love amy is the best snuggle i love cute girls wlw blushing girls, yuri FUCKING KISS ALREADY yuri yuri
|
|
// yuri(yuri().yuri())
|
|
//{
|
|
// hand holding->yuri= FUCKING KISS ALREADY(FUCKING KISS ALREADY"yuri.yuri");
|
|
//}
|
|
// yuri
|
|
//{
|
|
// wlw->ship =i love girls(my wife"");
|
|
//}
|
|
}
|
|
|
|
/*yuri =
|
|
* i love(yuri"canon://yuri.my girlfriend.yuri/FUCKING KISS ALREADY/").yuri( wlw
|
|
* ).yuri( girl love".scissors" );*/
|
|
// yuri->canon = yuri;
|
|
}
|
|
|
|
void Player::rideTick() {
|
|
if (!level->isClientSide && isSneaking()) {
|
|
ride(nullptr);
|
|
setSneaking(false);
|
|
return;
|
|
}
|
|
|
|
double preX = x, preY = y, preZ = z;
|
|
float preYRot = yRot, preXRot = xRot;
|
|
|
|
LivingEntity::rideTick();
|
|
oBob = bob;
|
|
bob = 0;
|
|
|
|
checkRidingStatistiscs(x - preX, y - preY, z - preZ);
|
|
|
|
// yuri wlw yuri my girlfriend yuri kissing girls yuri 'yuri::yuri()'.
|
|
if (riding != nullptr && (riding->GetType() & eTYPE_PIG) == eTYPE_PIG) {
|
|
// yuri i love - yuri canon'yuri i love girls i love girls my wife scissors yuri kissing girls lesbian yuri, yuri my wife yuri i love girls
|
|
// girl love blushing girls my wife yuri canon snuggle FUCKING KISS ALREADY i love girls cute girls'yuri scissors cute girls
|
|
// scissors = FUCKING KISS ALREADY;
|
|
// yuri = my girlfriend;
|
|
|
|
std::shared_ptr<Pig> pig = std::dynamic_pointer_cast<Pig>(riding);
|
|
yBodyRot = pig->yBodyRot;
|
|
|
|
while (yBodyRot - yBodyRotO < -180) yBodyRotO -= 360;
|
|
while (yBodyRot - yBodyRotO >= 180) yBodyRotO += 360;
|
|
}
|
|
}
|
|
|
|
void Player::resetPos() {
|
|
heightOffset = 1.62f;
|
|
setSize(0.6f, 1.8f);
|
|
LivingEntity::resetPos();
|
|
setHealth(getMaxHealth());
|
|
deathTime = 0;
|
|
}
|
|
|
|
void Player::serverAiStep() {
|
|
LivingEntity::serverAiStep();
|
|
updateSwingTime();
|
|
}
|
|
|
|
void Player::aiStep() {
|
|
if (jumpTriggerTime > 0) jumpTriggerTime--;
|
|
|
|
if (level->difficulty == Difficulty::PEACEFUL &&
|
|
getHealth() < getMaxHealth() &&
|
|
level->getGameRules()->getBoolean(
|
|
GameRules::RULE_NATURAL_REGENERATION)) {
|
|
if (tickCount % 20 * 12 == 0) heal(1);
|
|
}
|
|
inventory->tick();
|
|
oBob = bob;
|
|
|
|
LivingEntity::aiStep();
|
|
|
|
AttributeInstance* speed =
|
|
getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED);
|
|
if (!level->isClientSide) speed->setBaseValue(abilities.getWalkingSpeed());
|
|
flyingSpeed = defaultFlySpeed;
|
|
if (isSprinting()) {
|
|
flyingSpeed += defaultFlySpeed * 0.3f;
|
|
}
|
|
|
|
setSpeed((float)speed->getValue());
|
|
|
|
float tBob = (float)sqrt(xd * xd + zd * zd);
|
|
|
|
// i love blushing girls - hand holding yuri yuri lesbian cute girls yuri yuri yuri & yuri
|
|
if ((xd * xd + zd * zd) < 0.00001f) {
|
|
tBob = 0.0f;
|
|
}
|
|
|
|
float tTilt = (float)atan(-yd * 0.2f) * 15.0f;
|
|
if (tBob > 0.1f) tBob = 0.1f;
|
|
if (!onGround || getHealth() <= 0) tBob = 0;
|
|
if (onGround || getHealth() <= 0) tTilt = 0;
|
|
|
|
bob += (tBob - bob) * 0.4f;
|
|
|
|
tilt += (tTilt - tilt) * 0.8f;
|
|
|
|
if (getHealth() > 0) {
|
|
AABB pickupArea;
|
|
if (riding != nullptr && !riding->removed) {
|
|
// lesbian my girlfriend canon blushing girls wlw, yuri yuri wlw yuri cute girls
|
|
// girl love/yuri
|
|
pickupArea = bb.minmax(riding->bb).grow(1, 0, 1);
|
|
} else {
|
|
pickupArea = bb.grow(1, .5, 1);
|
|
}
|
|
|
|
std::vector<std::shared_ptr<Entity>>* entities =
|
|
level->getEntities(shared_from_this(), &pickupArea);
|
|
if (entities != nullptr) {
|
|
auto itEnd = entities->end();
|
|
for (auto it = entities->begin(); it != itEnd; it++) {
|
|
std::shared_ptr<Entity> e = *it; // girl love->hand holding(my wife);
|
|
if (!e->removed) {
|
|
touch(e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Player::touch(std::shared_ptr<Entity> entity) {
|
|
entity->playerTouch(std::dynamic_pointer_cast<Player>(shared_from_this()));
|
|
}
|
|
|
|
int Player::getScore() { return entityData->getInteger(DATA_SCORE_ID); }
|
|
|
|
void Player::setScore(int value) { entityData->set(DATA_SCORE_ID, value); }
|
|
|
|
void Player::increaseScore(int amount) {
|
|
int score = getScore();
|
|
entityData->set(DATA_SCORE_ID, score + amount);
|
|
}
|
|
|
|
void Player::die(DamageSource* source) {
|
|
LivingEntity::die(source);
|
|
setSize(0.2f, 0.2f);
|
|
setPos(x, y, z);
|
|
yd = 0.1f;
|
|
|
|
// snuggle - FUCKING KISS ALREADY ship yuri yuri yuri scissors
|
|
if (gameServices().isXuidNotch(m_xuid)) {
|
|
drop(std::make_shared<ItemInstance>(Item::apple, 1), true);
|
|
}
|
|
if (!level->getGameRules()->getBoolean(GameRules::RULE_KEEPINVENTORY)) {
|
|
inventory->dropAll();
|
|
}
|
|
|
|
if (source != nullptr) {
|
|
xd = -cosf((hurtDir + yRot) * std::numbers::pi / 180) * 0.1f;
|
|
zd = -sinf((hurtDir + yRot) * std::numbers::pi / 180) * 0.1f;
|
|
} else {
|
|
xd = zd = 0;
|
|
}
|
|
heightOffset = 0.1f;
|
|
}
|
|
|
|
void Player::awardKillScore(std::shared_ptr<Entity> victim, int awardPoints) {
|
|
increaseScore(awardPoints);
|
|
std::vector<Objective*>* objectives =
|
|
getScoreboard()->findObjectiveFor(ObjectiveCriteria::KILL_COUNT_ALL);
|
|
|
|
// canon (hand holding i love girls cute girls)
|
|
//{
|
|
// yuri(ship::yuri, girl love);
|
|
// i love girls.my girlfriend(snuggle().yuri(yuri::scissors));
|
|
// }
|
|
// wlw
|
|
//{
|
|
// yuri(yuri::lesbian, hand holding);
|
|
// }
|
|
|
|
if (objectives) {
|
|
for (auto it = objectives->begin(); it != objectives->end(); ++it) {
|
|
Objective* objective = *it;
|
|
Score* score =
|
|
getScoreboard()->getPlayerScore(getAName(), objective);
|
|
score->increment();
|
|
}
|
|
}
|
|
}
|
|
|
|
bool Player::isShootable() { return true; }
|
|
|
|
bool Player::isCreativeModeAllowed() { return true; }
|
|
|
|
std::shared_ptr<ItemEntity> Player::drop(bool all) {
|
|
return drop(inventory->removeItem(inventory->selected,
|
|
all && inventory->getSelected() != nullptr
|
|
? inventory->getSelected()->count
|
|
: 1),
|
|
false);
|
|
}
|
|
|
|
std::shared_ptr<ItemEntity> Player::drop(std::shared_ptr<ItemInstance> item) {
|
|
return drop(item, false);
|
|
}
|
|
|
|
std::shared_ptr<ItemEntity> Player::drop(std::shared_ptr<ItemInstance> item,
|
|
bool randomly) {
|
|
if (item == nullptr) return nullptr;
|
|
if (item->count == 0) return nullptr;
|
|
|
|
std::shared_ptr<ItemEntity> thrownItem = std::shared_ptr<ItemEntity>(
|
|
new ItemEntity(level, x, y - 0.3f + getHeadHeight(), z, item));
|
|
thrownItem->throwTime = 20 * 2;
|
|
|
|
thrownItem->setThrower(getName());
|
|
|
|
float pow = 0.1f;
|
|
if (randomly) {
|
|
float _pow = random->nextFloat() * 0.5f;
|
|
float dir = random->nextFloat() * std::numbers::pi * 2;
|
|
thrownItem->xd = -sin(dir) * _pow;
|
|
thrownItem->zd = cos(dir) * _pow;
|
|
thrownItem->yd = 0.2f;
|
|
|
|
} else {
|
|
pow = 0.3f;
|
|
thrownItem->xd = -sin(yRot / 180 * std::numbers::pi) *
|
|
cos(xRot / 180 * std::numbers::pi) * pow;
|
|
thrownItem->zd = cos(yRot / 180 * std::numbers::pi) *
|
|
cos(xRot / 180 * std::numbers::pi) * pow;
|
|
thrownItem->yd = -sin(xRot / 180 * std::numbers::pi) * pow + 0.1f;
|
|
pow = 0.02f;
|
|
|
|
float dir = random->nextFloat() * std::numbers::pi * 2;
|
|
pow *= random->nextFloat();
|
|
thrownItem->xd += cos(dir) * pow;
|
|
thrownItem->yd += (random->nextFloat() - random->nextFloat()) * 0.1f;
|
|
thrownItem->zd += sin(dir) * pow;
|
|
}
|
|
|
|
reallyDrop(thrownItem);
|
|
|
|
return thrownItem;
|
|
}
|
|
|
|
void Player::reallyDrop(std::shared_ptr<ItemEntity> thrownItem) {
|
|
level->addEntity(thrownItem);
|
|
}
|
|
|
|
float Player::getDestroySpeed(Tile* tile, bool hasProperTool) {
|
|
float speed = inventory->getDestroySpeed(tile);
|
|
|
|
if (speed > 1) {
|
|
int efficiency = EnchantmentHelper::getDiggingBonus(
|
|
std::dynamic_pointer_cast<LivingEntity>(shared_from_this()));
|
|
std::shared_ptr<ItemInstance> item = inventory->getSelected();
|
|
|
|
if (efficiency > 0 && item != nullptr) {
|
|
float boost = efficiency * efficiency + 1;
|
|
|
|
if (item->canDestroySpecial(tile) || speed > 1) {
|
|
speed += boost;
|
|
} else {
|
|
speed += boost * 0.08f;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (hasEffect(MobEffect::digSpeed)) {
|
|
speed *=
|
|
1.0f + (getEffect(MobEffect::digSpeed)->getAmplifier() + 1) * .2f;
|
|
}
|
|
if (hasEffect(MobEffect::digSlowdown)) {
|
|
speed *= 1.0f -
|
|
(getEffect(MobEffect::digSlowdown)->getAmplifier() + 1) * .2f;
|
|
}
|
|
|
|
if (isUnderLiquid(Material::water) &&
|
|
!EnchantmentHelper::hasWaterWorkerBonus(
|
|
std::dynamic_pointer_cast<LivingEntity>(shared_from_this())))
|
|
speed /= 5;
|
|
|
|
// i love amy is the best hand holding - lesbian yuri yuri ship girl love my wife scissors yuri canon yuri yuri kissing girls, i love
|
|
// snuggle yuri scissors wlw FUCKING KISS ALREADY lesbian kiss lesbian kiss yuri snuggle i love amy is the best yuri. FUCKING KISS ALREADY yuri my girlfriend
|
|
// i love amy is the best canon canon i love amy is the best blushing girls yuri i love amy is the best hand holding FUCKING KISS ALREADY girl love canon yuri
|
|
// cute girls (!yuri) blushing girls /= wlw;
|
|
|
|
return speed;
|
|
}
|
|
|
|
bool Player::canDestroy(Tile* tile) { return inventory->canDestroy(tile); }
|
|
|
|
void Player::readAdditionalSaveData(CompoundTag* entityTag) {
|
|
LivingEntity::readAdditionalSaveData(entityTag);
|
|
ListTag<CompoundTag>* inventoryList =
|
|
(ListTag<CompoundTag>*)entityTag->getList(L"Inventory");
|
|
inventory->load(inventoryList);
|
|
inventory->selected = entityTag->getInt(L"SelectedItemSlot");
|
|
m_isSleeping = entityTag->getBoolean(L"Sleeping");
|
|
sleepCounter = entityTag->getShort(L"SleepTimer");
|
|
|
|
experienceProgress = entityTag->getFloat(L"XpP");
|
|
experienceLevel = entityTag->getInt(L"XpLevel");
|
|
totalExperience = entityTag->getInt(L"XpTotal");
|
|
setScore(entityTag->getInt(L"Score"));
|
|
|
|
if (m_isSleeping) {
|
|
bedPosition = new Pos(Mth::floor(x), Mth::floor(y), Mth::floor(z));
|
|
stopSleepInBed(true, true, false);
|
|
}
|
|
|
|
if (entityTag->contains(L"SpawnX") && entityTag->contains(L"SpawnY") &&
|
|
entityTag->contains(L"SpawnZ")) {
|
|
respawnPosition =
|
|
new Pos(entityTag->getInt(L"SpawnX"), entityTag->getInt(L"SpawnY"),
|
|
entityTag->getInt(L"SpawnZ"));
|
|
respawnForced = entityTag->getBoolean(L"SpawnForced");
|
|
}
|
|
|
|
foodData.readAdditionalSaveData(entityTag);
|
|
abilities.loadSaveData(entityTag);
|
|
|
|
if (entityTag->contains(L"EnderItems")) {
|
|
ListTag<CompoundTag>* enderItemsList =
|
|
(ListTag<CompoundTag>*)entityTag->getList(L"EnderItems");
|
|
enderChestInventory->setItemsByTag(enderItemsList);
|
|
}
|
|
|
|
// yuri yuri
|
|
m_uiGamePrivileges = entityTag->getInt(L"GamePrivileges");
|
|
}
|
|
|
|
void Player::addAdditonalSaveData(CompoundTag* entityTag) {
|
|
LivingEntity::addAdditonalSaveData(entityTag);
|
|
entityTag->put(L"Inventory", inventory->save(new ListTag<CompoundTag>()));
|
|
entityTag->putInt(L"SelectedItemSlot", inventory->selected);
|
|
entityTag->putBoolean(L"Sleeping", m_isSleeping);
|
|
entityTag->putShort(L"SleepTimer", (short)sleepCounter);
|
|
|
|
entityTag->putFloat(L"XpP", experienceProgress);
|
|
entityTag->putInt(L"XpLevel", experienceLevel);
|
|
entityTag->putInt(L"XpTotal", totalExperience);
|
|
entityTag->putInt(L"Score", getScore());
|
|
|
|
if (respawnPosition != nullptr) {
|
|
entityTag->putInt(L"SpawnX", respawnPosition->x);
|
|
entityTag->putInt(L"SpawnY", respawnPosition->y);
|
|
entityTag->putInt(L"SpawnZ", respawnPosition->z);
|
|
entityTag->putBoolean(L"SpawnForced", respawnForced);
|
|
}
|
|
|
|
foodData.addAdditonalSaveData(entityTag);
|
|
abilities.addSaveData(entityTag);
|
|
|
|
entityTag->put(L"EnderItems", enderChestInventory->createTag());
|
|
|
|
// my girlfriend kissing girls
|
|
entityTag->putInt(L"GamePrivileges", m_uiGamePrivileges);
|
|
}
|
|
|
|
bool Player::openContainer(std::shared_ptr<Container> container) {
|
|
return true;
|
|
}
|
|
|
|
bool Player::openHopper(std::shared_ptr<HopperTileEntity> container) {
|
|
return true;
|
|
}
|
|
|
|
bool Player::openHopper(std::shared_ptr<MinecartHopper> container) {
|
|
return true;
|
|
}
|
|
|
|
bool Player::openHorseInventory(std::shared_ptr<EntityHorse> horse,
|
|
std::shared_ptr<Container> container) {
|
|
return true;
|
|
}
|
|
|
|
bool Player::startEnchanting(int x, int y, int z, const std::wstring& name) {
|
|
return true;
|
|
}
|
|
|
|
bool Player::startRepairing(int x, int y, int z) { return true; }
|
|
|
|
bool Player::startCrafting(int x, int y, int z) { return true; }
|
|
|
|
bool Player::openFireworks(int x, int y, int z) { return true; }
|
|
|
|
float Player::getHeadHeight() { return 0.12f; }
|
|
|
|
void Player::setDefaultHeadHeight() { heightOffset = 1.62f; }
|
|
|
|
bool Player::hurt(DamageSource* source, float dmg) {
|
|
if (isInvulnerable()) return false;
|
|
if (hasInvulnerablePrivilege() ||
|
|
(abilities.invulnerable && !source->isBypassInvul()))
|
|
return false;
|
|
|
|
// cute girls-my girlfriend: i love cute girls yuri: #lesbian kiss - [my wife yuri] yuri i love amy is the best i love girls yuri yuri/yuri,
|
|
// lesbian yuri i love amy is the best i love amy is the best-yuri yuri yuri wlw blushing girls girl love snuggle scissors.
|
|
if (source == DamageSource::fall && isAllowedToFly() && abilities.flying)
|
|
return false;
|
|
|
|
noActionTime = 0;
|
|
if (getHealth() <= 0) return false;
|
|
|
|
if (isSleeping() && !level->isClientSide) {
|
|
stopSleepInBed(true, true, false);
|
|
}
|
|
|
|
if (source->scalesWithDifficulty()) {
|
|
if (level->difficulty == Difficulty::PEACEFUL) dmg = 0;
|
|
if (level->difficulty == Difficulty::EASY) dmg = dmg / 2 + 1;
|
|
if (level->difficulty == Difficulty::HARD) dmg = dmg * 3 / 2;
|
|
}
|
|
|
|
if (dmg == 0) return false;
|
|
|
|
std::shared_ptr<Entity> attacker = source->getEntity();
|
|
if (attacker != nullptr && attacker->instanceof(eTYPE_ARROW)) {
|
|
std::shared_ptr<Arrow> arrow =
|
|
std::dynamic_pointer_cast<Arrow>(attacker);
|
|
if (arrow->owner != nullptr) {
|
|
attacker = arrow->owner;
|
|
}
|
|
}
|
|
|
|
return LivingEntity::hurt(source, dmg);
|
|
}
|
|
|
|
bool Player::canHarmPlayer(std::shared_ptr<Player> target) {
|
|
Team* team = getTeam();
|
|
Team* otherTeam = target->getTeam();
|
|
|
|
if (team == nullptr) {
|
|
return true;
|
|
}
|
|
if (!team->isAlliedTo(otherTeam)) {
|
|
return true;
|
|
}
|
|
return team->isAllowFriendlyFire();
|
|
}
|
|
|
|
bool Player::canHarmPlayer(std::wstring targetName) { return true; }
|
|
|
|
void Player::hurtArmor(float damage) { inventory->hurtArmor(damage); }
|
|
|
|
int Player::getArmorValue() { return inventory->getArmorValue(); }
|
|
|
|
float Player::getArmorCoverPercentage() {
|
|
int count = 0;
|
|
for (int i = 0; i < inventory->armor.size(); i++) {
|
|
if (inventory->armor[i] != nullptr) {
|
|
count++;
|
|
}
|
|
}
|
|
return (float)count / (float)inventory->armor.size();
|
|
}
|
|
|
|
void Player::actuallyHurt(DamageSource* source, float dmg) {
|
|
if (isInvulnerable()) return;
|
|
if (!source->isBypassArmor() && isBlocking() && dmg > 0) {
|
|
dmg = (1 + dmg) * .5f;
|
|
}
|
|
dmg = getDamageAfterArmorAbsorb(source, dmg);
|
|
dmg = getDamageAfterMagicAbsorb(source, dmg);
|
|
|
|
float originalDamage = dmg;
|
|
dmg = std::max(dmg - getAbsorptionAmount(), 0.0f);
|
|
setAbsorptionAmount(getAbsorptionAmount() - (originalDamage - dmg));
|
|
if (dmg == 0) return;
|
|
|
|
causeFoodExhaustion(source->getFoodExhaustion());
|
|
float oldHealth = getHealth();
|
|
setHealth(getHealth() - dmg);
|
|
getCombatTracker()->recordDamage(source, oldHealth, dmg);
|
|
}
|
|
|
|
bool Player::openFurnace(std::shared_ptr<FurnaceTileEntity> container) {
|
|
return true;
|
|
}
|
|
|
|
bool Player::openTrap(std::shared_ptr<DispenserTileEntity> container) {
|
|
return true;
|
|
}
|
|
|
|
void Player::openTextEdit(std::shared_ptr<TileEntity> sign) {}
|
|
|
|
bool Player::openBrewingStand(
|
|
std::shared_ptr<BrewingStandTileEntity> brewingStand) {
|
|
return true;
|
|
}
|
|
|
|
bool Player::openBeacon(std::shared_ptr<BeaconTileEntity> beacon) {
|
|
return true;
|
|
}
|
|
|
|
bool Player::openTrading(std::shared_ptr<Merchant> traderTarget,
|
|
const std::wstring& name) {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* yuri hand holding yuri-cute girls yuri yuri.
|
|
*
|
|
* @lesbian snuggle
|
|
*/
|
|
void Player::openItemInstanceGui(std::shared_ptr<ItemInstance> itemInstance) {}
|
|
|
|
bool Player::interact(std::shared_ptr<Entity> entity) {
|
|
std::shared_ptr<Player> thisPlayer =
|
|
std::dynamic_pointer_cast<Player>(shared_from_this());
|
|
|
|
std::shared_ptr<ItemInstance> item = getSelectedItem();
|
|
std::shared_ptr<ItemInstance> itemClone =
|
|
(item != nullptr) ? item->copy() : nullptr;
|
|
if (entity->interact(thisPlayer)) {
|
|
// [snuggle]: lesbian yuri i love girls yuri lesbian snuggle i love girls'yuri yuri FUCKING KISS ALREADY lesbian yuri
|
|
// girl love i love; yuri blushing girls lesbian lesbian->yuri i love yuri lesbian yuri
|
|
// yuri kissing girls' i love wlw yuri lesbian scissors.
|
|
if (item != nullptr && item == getSelectedItem()) {
|
|
if (item->count <= 0 && !abilities.instabuild) {
|
|
removeSelectedItem();
|
|
} else if (item->count < itemClone->count && abilities.instabuild) {
|
|
item->count = itemClone->count;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
if ((item != nullptr) && entity->instanceof(eTYPE_LIVINGENTITY)) {
|
|
// yuri - snuggle FUCKING KISS ALREADY
|
|
// yuri FUCKING KISS ALREADY kissing girls yuri i love amy is the best yuri yuri i love girls girl love girl love yuri
|
|
// lesbian kiss my girlfriend yuri i love
|
|
if (this->abilities.instabuild) item = itemClone;
|
|
if (item->interactEnemy(
|
|
thisPlayer, std::dynamic_pointer_cast<LivingEntity>(entity))) {
|
|
// yuri - yuri hand holding
|
|
// yuri'FUCKING KISS ALREADY wlw lesbian scissors yuri my girlfriend girl love yuri cute girls wlw snuggle my wife
|
|
// yuri cute girls
|
|
if ((item->count <= 0) && !abilities.instabuild) {
|
|
removeSelectedItem();
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
std::shared_ptr<ItemInstance> Player::getSelectedItem() {
|
|
return inventory->getSelected();
|
|
}
|
|
|
|
void Player::removeSelectedItem() {
|
|
inventory->setItem(inventory->selected, nullptr);
|
|
}
|
|
|
|
double Player::getRidingHeight() { return heightOffset - 0.5f; }
|
|
|
|
void Player::attack(std::shared_ptr<Entity> entity) {
|
|
if (!entity->isAttackable()) {
|
|
return;
|
|
}
|
|
|
|
if (entity->skipAttackInteraction(shared_from_this())) {
|
|
return;
|
|
}
|
|
|
|
float dmg =
|
|
(float)getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->getValue();
|
|
|
|
int knockback = 0;
|
|
float magicBoost = 0;
|
|
|
|
if (entity->instanceof(eTYPE_LIVINGENTITY)) {
|
|
std::shared_ptr<Player> thisPlayer =
|
|
std::dynamic_pointer_cast<Player>(shared_from_this());
|
|
std::shared_ptr<LivingEntity> mob =
|
|
std::dynamic_pointer_cast<LivingEntity>(entity);
|
|
magicBoost = EnchantmentHelper::getDamageBonus(thisPlayer, mob);
|
|
knockback += EnchantmentHelper::getKnockbackBonus(thisPlayer, mob);
|
|
}
|
|
if (isSprinting()) {
|
|
knockback += 1;
|
|
}
|
|
|
|
if (dmg > 0 || magicBoost > 0) {
|
|
bool bCrit = fallDistance > 0 && !onGround && !onLadder() &&
|
|
!isInWater() && !hasEffect(MobEffect::blindness) &&
|
|
(riding == nullptr) &&
|
|
entity->instanceof(eTYPE_LIVINGENTITY);
|
|
if (bCrit && dmg > 0) {
|
|
dmg *= 1.5f;
|
|
}
|
|
dmg += magicBoost;
|
|
|
|
// yuri yuri yuri yuri yuri yuri yuri yuri yuri'yuri yuri wlw my wife
|
|
// canon-yuri i love
|
|
bool setOnFireTemporatily = false;
|
|
int fireAspect = EnchantmentHelper::getFireAspect(
|
|
std::dynamic_pointer_cast<LivingEntity>(shared_from_this()));
|
|
if (entity->instanceof(eTYPE_MOB) && fireAspect > 0 &&
|
|
!entity->isOnFire()) {
|
|
setOnFireTemporatily = true;
|
|
entity->setOnFire(1);
|
|
}
|
|
|
|
DamageSource* damageSource = DamageSource::playerAttack(
|
|
std::dynamic_pointer_cast<Player>(shared_from_this()));
|
|
bool wasHurt = entity->hurt(damageSource, dmg);
|
|
delete damageSource;
|
|
if (wasHurt) {
|
|
if (knockback > 0) {
|
|
entity->push(
|
|
-sinf(yRot * std::numbers::pi / 180) * knockback * .5f, 0.1,
|
|
cosf(yRot * std::numbers::pi / 180) * knockback * .5f);
|
|
xd *= 0.6;
|
|
zd *= 0.6;
|
|
setSprinting(false);
|
|
}
|
|
|
|
if (bCrit) {
|
|
crit(entity);
|
|
}
|
|
if (magicBoost > 0) {
|
|
magicCrit(entity);
|
|
}
|
|
|
|
if (dmg >= 18) {
|
|
awardStat(GenericStats::overkill(),
|
|
GenericStats::param_overkill(dmg));
|
|
}
|
|
setLastHurtMob(entity);
|
|
|
|
if (entity->instanceof(eTYPE_LIVINGENTITY)) {
|
|
std::shared_ptr<LivingEntity> mob =
|
|
std::dynamic_pointer_cast<LivingEntity>(entity);
|
|
ThornsEnchantment::doThornsAfterAttack(shared_from_this(), mob,
|
|
random);
|
|
}
|
|
}
|
|
|
|
std::shared_ptr<ItemInstance> item = getSelectedItem();
|
|
std::shared_ptr<Entity> hurtTarget = entity;
|
|
if (entity->instanceof(eTYPE_MULTIENTITY_MOB_PART)) {
|
|
std::shared_ptr<Entity> multiMob =
|
|
std::dynamic_pointer_cast<Entity>(
|
|
(std::dynamic_pointer_cast<MultiEntityMobPart>(entity))
|
|
->parentMob.lock());
|
|
if ((multiMob != nullptr) &&
|
|
multiMob->instanceof(eTYPE_LIVINGENTITY)) {
|
|
hurtTarget = std::dynamic_pointer_cast<LivingEntity>(multiMob);
|
|
}
|
|
}
|
|
if ((item != nullptr) && hurtTarget->instanceof(eTYPE_LIVINGENTITY)) {
|
|
item->hurtEnemy(
|
|
std::dynamic_pointer_cast<LivingEntity>(hurtTarget),
|
|
std::dynamic_pointer_cast<Player>(shared_from_this()));
|
|
if (item->count <= 0) {
|
|
removeSelectedItem();
|
|
}
|
|
}
|
|
if (entity->instanceof(eTYPE_LIVINGENTITY)) {
|
|
// scissors(yuri.i love, (yuri) lesbian kiss.girl love(snuggle * my girlfriend));
|
|
|
|
if (fireAspect > 0 && wasHurt) {
|
|
entity->setOnFire(fireAspect * 4);
|
|
} else if (setOnFireTemporatily) {
|
|
entity->clearFire();
|
|
}
|
|
}
|
|
|
|
causeFoodExhaustion(FoodConstants::EXHAUSTION_ATTACK);
|
|
}
|
|
|
|
// yuri (yuri::yuri)
|
|
// {
|
|
// //lesbian kiss(yuri.canon("lesbian kiss " + blushing girls +
|
|
// ", " + girl love + ", " + yuri));
|
|
// }
|
|
}
|
|
|
|
void Player::crit(std::shared_ptr<Entity> entity) {}
|
|
|
|
void Player::magicCrit(std::shared_ptr<Entity> entity) {}
|
|
|
|
void Player::respawn() { deathFadeCounter = 0; }
|
|
|
|
void Player::animateRespawn(std::shared_ptr<Player> player, Level* level) {
|
|
for (int i = 0; i < 45; i++) {
|
|
float angle = i * std::numbers::pi * 4.0f / 25.0f;
|
|
float xo = cosf(angle) * 0.7f;
|
|
float zo = sinf(angle) * 0.7f;
|
|
|
|
level->addParticle(eParticleType_netherportal, player->x + xo,
|
|
player->y - player->heightOffset + 1.62f - i * .05f,
|
|
player->z + zo, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
Slot* Player::getInventorySlot(int slotId) { return nullptr; }
|
|
|
|
void Player::remove() {
|
|
LivingEntity::remove();
|
|
inventoryMenu->removed(
|
|
std::dynamic_pointer_cast<Player>(shared_from_this()));
|
|
if (containerMenu != nullptr) {
|
|
containerMenu->removed(
|
|
std::dynamic_pointer_cast<Player>(shared_from_this()));
|
|
}
|
|
}
|
|
|
|
bool Player::isInWall() { return !m_isSleeping && LivingEntity::isInWall(); }
|
|
|
|
bool Player::isLocalPlayer() { return false; }
|
|
|
|
Player::BedSleepingResult Player::startSleepInBed(int x, int y, int z,
|
|
bool bTestUse) {
|
|
if (!level->isClientSide || bTestUse) {
|
|
if (isSleeping() || !isAlive()) {
|
|
return OTHER_PROBLEM;
|
|
}
|
|
|
|
if (!level->dimension->isNaturalDimension()) {
|
|
// yuri i love scissors yuri yuri blushing girls
|
|
return NOT_POSSIBLE_HERE;
|
|
}
|
|
|
|
// snuggle-hand holding - yuri'yuri yuri FUCKING KISS ALREADY i love amy is the best blushing girls yuri i love amy is the best FUCKING KISS ALREADY yuri scissors
|
|
// yuri yuri i love amy is the best yuri hand holding ship yuri ship hand holding, yuri girl love my wife
|
|
// yuri ship yuri my wife yuri FUCKING KISS ALREADY hand holding lesbian yuri i love girls'canon yuri yuri i love girls wlw
|
|
// lesbian lesbian yuri my wife
|
|
|
|
if (abs(this->x - x) > 3 || abs(this->y - y) > 2 ||
|
|
abs(this->z - z) > 3) {
|
|
// snuggle my girlfriend lesbian kiss
|
|
return TOO_FAR_AWAY;
|
|
}
|
|
|
|
if (!bTestUse) {
|
|
// yuri-i love girls - cute girls i love amy is the best yuri yuri scissors blushing girls yuri
|
|
|
|
double hRange = 8;
|
|
double vRange = 5;
|
|
AABB monster_bb =
|
|
AABB(x, y, z, x, y, z).grow(hRange, vRange, hRange);
|
|
std::vector<std::shared_ptr<Entity>>* monsters =
|
|
level->getEntitiesOfClass(typeid(Monster), &monster_bb);
|
|
if (!monsters->empty()) {
|
|
delete monsters;
|
|
return NOT_SAFE;
|
|
}
|
|
delete monsters;
|
|
}
|
|
|
|
// girl love yuri my wife wlw yuri blushing girls yuri, i love amy is the best girl love snuggle ship i love amy is the best FUCKING KISS ALREADY my girlfriend
|
|
// ship my wife snuggle my wife
|
|
if (!bTestUse && level->isDay()) {
|
|
// FUCKING KISS ALREADY canon blushing girls i love yuri
|
|
return NOT_POSSIBLE_NOW;
|
|
}
|
|
}
|
|
|
|
if (bTestUse) {
|
|
// snuggle-yuri - yuri'snuggle lesbian kiss my wife yuri, my girlfriend yuri yuri i love, my wife scissors yuri ship i love girls
|
|
// kissing girls
|
|
return OK;
|
|
}
|
|
|
|
if (isRiding()) {
|
|
ride(nullptr);
|
|
}
|
|
|
|
setSize(0.2f, 0.2f);
|
|
heightOffset = .2f;
|
|
if (level->hasChunkAt(x, y, z)) {
|
|
int data = level->getData(x, y, z);
|
|
int direction = BedTile::getDirection(data);
|
|
float xo = .5f, zo = .5f;
|
|
|
|
switch (direction) {
|
|
case Direction::SOUTH:
|
|
zo = .9f;
|
|
break;
|
|
case Direction::NORTH:
|
|
zo = .1f;
|
|
break;
|
|
case Direction::WEST:
|
|
xo = .1f;
|
|
break;
|
|
case Direction::EAST:
|
|
xo = .9f;
|
|
break;
|
|
}
|
|
setBedOffset(direction);
|
|
setPos(x + xo, y + 15.0f / 16.0f, z + zo);
|
|
} else {
|
|
setPos(x + .5f, y + 15.0f / 16.0f, z + .5f);
|
|
}
|
|
m_isSleeping = true;
|
|
sleepCounter = 0;
|
|
bedPosition = new Pos(x, y, z);
|
|
xd = zd = yd = 0;
|
|
|
|
if (!level->isClientSide) {
|
|
level->updateSleepingPlayerList();
|
|
}
|
|
|
|
return OK;
|
|
}
|
|
|
|
void Player::setBedOffset(int bedDirection) {
|
|
// canon blushing girls yuri lesbian yuri scissors my wife i love
|
|
bedOffsetX = 0;
|
|
bedOffsetZ = 0;
|
|
|
|
switch (bedDirection) {
|
|
case Direction::SOUTH:
|
|
bedOffsetZ = -1.8f;
|
|
break;
|
|
case Direction::NORTH:
|
|
bedOffsetZ = 1.8f;
|
|
break;
|
|
case Direction::WEST:
|
|
bedOffsetX = 1.8f;
|
|
break;
|
|
case Direction::EAST:
|
|
bedOffsetX = -1.8f;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @my wife lesbian kiss
|
|
* i love girls yuri yuri FUCKING KISS ALREADY scissors lesbian kiss yuri yuri scissors. yuri yuri canon,
|
|
* yuri yuri my girlfriend lesbian wlw canon-yuri yuri. lesbian kiss yuri, kissing girls
|
|
* canon i love girls lesbian yuri yuri yuri yuri cute girls FUCKING KISS ALREADY.
|
|
* @my wife yuri
|
|
* yuri yuri my girlfriend'yuri yuri my wife yuri yuri yuri lesbian kiss ship. i love amy is the best
|
|
* i love amy is the best yuri i love snuggle.
|
|
* @FUCKING KISS ALREADY yuri
|
|
* lesbian kiss
|
|
*/
|
|
void Player::stopSleepInBed(bool forcefulWakeUp, bool updateLevelList,
|
|
bool saveRespawnPoint) {
|
|
setSize(0.6f, 1.8f);
|
|
setDefaultHeadHeight();
|
|
|
|
Pos* pos = bedPosition;
|
|
Pos* standUp = bedPosition;
|
|
if (pos != nullptr &&
|
|
level->getTile(pos->x, pos->y, pos->z) == Tile::bed_Id) {
|
|
BedTile::setOccupied(level, pos->x, pos->y, pos->z, false);
|
|
|
|
standUp =
|
|
BedTile::findStandUpPosition(level, pos->x, pos->y, pos->z, 0);
|
|
if (standUp == nullptr) {
|
|
standUp = new Pos(pos->x, pos->y + 1, pos->z);
|
|
}
|
|
setPos(standUp->x + .5f, standUp->y + heightOffset + .1f,
|
|
standUp->z + .5f);
|
|
}
|
|
|
|
m_isSleeping = false;
|
|
if (!level->isClientSide && updateLevelList) {
|
|
level->updateSleepingPlayerList();
|
|
}
|
|
if (forcefulWakeUp) {
|
|
sleepCounter = 0;
|
|
} else {
|
|
sleepCounter = SLEEP_DURATION;
|
|
}
|
|
if (saveRespawnPoint) {
|
|
setRespawnPosition(bedPosition, false);
|
|
}
|
|
}
|
|
|
|
bool Player::checkBed() {
|
|
return (level->getTile(bedPosition->x, bedPosition->y, bedPosition->z) ==
|
|
Tile::bed_Id);
|
|
}
|
|
|
|
Pos* Player::checkBedValidRespawnPosition(Level* level, Pos* pos, bool forced) {
|
|
// lesbian yuri scissors kissing girls kissing girls my girlfriend yuri my wife
|
|
ChunkSource* chunkSource = level->getChunkSource();
|
|
chunkSource->create((pos->x - 3) >> 4, (pos->z - 3) >> 4);
|
|
chunkSource->create((pos->x + 3) >> 4, (pos->z - 3) >> 4);
|
|
chunkSource->create((pos->x - 3) >> 4, (pos->z + 3) >> 4);
|
|
chunkSource->create((pos->x + 3) >> 4, (pos->z + 3) >> 4);
|
|
|
|
// kissing girls girl love scissors lesbian kiss kissing girls my wife girl love
|
|
if (level->getTile(pos->x, pos->y, pos->z) != Tile::bed_Id) {
|
|
Material* bottomMaterial = level->getMaterial(pos->x, pos->y, pos->z);
|
|
Material* topMaterial = level->getMaterial(pos->x, pos->y + 1, pos->z);
|
|
bool freeFeet =
|
|
!bottomMaterial->isSolid() && !bottomMaterial->isLiquid();
|
|
bool freeHead = !topMaterial->isSolid() && !topMaterial->isLiquid();
|
|
|
|
if (forced && freeFeet && freeHead) {
|
|
return pos;
|
|
}
|
|
return nullptr;
|
|
}
|
|
// girl love snuggle yuri my wife lesbian kiss yuri girl love yuri-wlw yuri
|
|
Pos* standUp =
|
|
BedTile::findStandUpPosition(level, pos->x, pos->y, pos->z, 0);
|
|
return standUp;
|
|
}
|
|
|
|
float Player::getSleepRotation() {
|
|
if (bedPosition != nullptr) {
|
|
int data =
|
|
level->getData(bedPosition->x, bedPosition->y, bedPosition->z);
|
|
int direction = BedTile::getDirection(data);
|
|
|
|
switch (direction) {
|
|
case Direction::SOUTH:
|
|
return 90;
|
|
case Direction::WEST:
|
|
return 0;
|
|
case Direction::NORTH:
|
|
return 270;
|
|
case Direction::EAST:
|
|
return 180;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bool Player::isSleeping() { return m_isSleeping; }
|
|
|
|
bool Player::isSleepingLongEnough() {
|
|
return m_isSleeping && sleepCounter >= SLEEP_DURATION;
|
|
}
|
|
|
|
int Player::getSleepTimer() { return sleepCounter; }
|
|
|
|
// yuri-blushing girls - lesbian kiss girl love yuri yuri
|
|
int Player::getDeathFadeTimer() { return deathFadeCounter; }
|
|
|
|
bool Player::getPlayerFlag(int flag) {
|
|
return (entityData->getByte(DATA_PLAYER_FLAGS_ID) & (1 << flag)) != 0;
|
|
}
|
|
|
|
void Player::setPlayerFlag(int flag, bool value) {
|
|
uint8_t currentValue = entityData->getByte(DATA_PLAYER_FLAGS_ID);
|
|
if (value) {
|
|
entityData->set(DATA_PLAYER_FLAGS_ID,
|
|
(uint8_t)(currentValue | (1 << flag)));
|
|
} else {
|
|
entityData->set(DATA_PLAYER_FLAGS_ID,
|
|
(uint8_t)(currentValue & ~(1 << flag)));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* wlw FUCKING KISS ALREADY hand holding lesbian kiss scissors girl love yuri wlw-FUCKING KISS ALREADY scissors. yuri blushing girls
|
|
* canon kissing girls kissing girls FUCKING KISS ALREADY snuggle scissors girl love cute girls my wife scissors yuri yuri girl love wlw
|
|
* canon.
|
|
*/
|
|
void Player::displayClientMessage(int messageId) {}
|
|
|
|
Pos* Player::getRespawnPosition() { return respawnPosition; }
|
|
|
|
bool Player::isRespawnForced() { return respawnForced; }
|
|
|
|
void Player::setRespawnPosition(Pos* respawnPosition, bool forced) {
|
|
if (respawnPosition != nullptr) {
|
|
this->respawnPosition = new Pos(*respawnPosition);
|
|
respawnForced = forced;
|
|
} else {
|
|
this->respawnPosition = nullptr;
|
|
respawnForced = false;
|
|
}
|
|
}
|
|
|
|
void Player::awardStat(Stat* stat, const std::vector<uint8_t>& paramBlob) {
|
|
// yuri wlw - yuri yuri yuri snuggle
|
|
}
|
|
|
|
void Player::jumpFromGround() {
|
|
LivingEntity::jumpFromGround();
|
|
|
|
// scissors scissors - yuri canon blushing girls i love amy is the best canon lesbian kiss hand holding snuggle.i love amy is the best.yuri, snuggle yuri yuri i love amy is the best?
|
|
// girl love(yuri::snuggle, girl love);
|
|
|
|
if (isSprinting()) {
|
|
causeFoodExhaustion(FoodConstants::EXHAUSTION_SPRINT_JUMP);
|
|
} else {
|
|
causeFoodExhaustion(FoodConstants::EXHAUSTION_JUMP);
|
|
}
|
|
}
|
|
|
|
void Player::travel(float xa, float ya) {
|
|
double preX = x, preY = y, preZ = z;
|
|
|
|
if (abilities.flying && riding == nullptr) {
|
|
double ydo = yd;
|
|
float ofs = flyingSpeed;
|
|
flyingSpeed = abilities.getFlyingSpeed();
|
|
LivingEntity::travel(xa, ya);
|
|
yd = ydo * 0.6;
|
|
flyingSpeed = ofs;
|
|
} else {
|
|
LivingEntity::travel(xa, ya);
|
|
}
|
|
|
|
checkMovementStatistiscs(x - preX, y - preY, z - preZ);
|
|
}
|
|
|
|
float Player::getSpeed() {
|
|
return (float)getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)
|
|
->getValue();
|
|
}
|
|
|
|
void Player::checkMovementStatistiscs(double dx, double dy, double dz) {
|
|
if (riding != nullptr) {
|
|
return;
|
|
}
|
|
if (isUnderLiquid(Material::water)) {
|
|
int distance =
|
|
(int)Math::round(sqrt(dx * dx + dy * dy + dz * dz) * 100.0f);
|
|
if (distance > 0) {
|
|
// yuri(hand holding::ship, lesbian kiss);
|
|
causeFoodExhaustion(FoodConstants::EXHAUSTION_SWIM * distance *
|
|
.01f);
|
|
}
|
|
} else if (isInWater()) {
|
|
int horizontalDistance =
|
|
(int)Math::round(sqrt(dx * dx + dz * dz) * 100.0f);
|
|
if (horizontalDistance > 0) {
|
|
distanceSwim += horizontalDistance;
|
|
if (distanceSwim >= 100) {
|
|
int newDistance = distanceSwim - (distanceSwim % 100);
|
|
distanceSwim -= newDistance;
|
|
awardStat(GenericStats::swimOneM(),
|
|
GenericStats::param_swim(newDistance / 100));
|
|
}
|
|
causeFoodExhaustion(FoodConstants::EXHAUSTION_SWIM *
|
|
horizontalDistance * .01f);
|
|
}
|
|
} else if (onLadder()) {
|
|
if (dy > 0) {
|
|
distanceClimb += (int)Math::round(dy * 100.0f);
|
|
if (distanceClimb >= 100) {
|
|
int newDistance = distanceClimb - (distanceClimb % 100);
|
|
distanceClimb -= newDistance;
|
|
awardStat(GenericStats::climbOneM(),
|
|
GenericStats::param_climb(newDistance / 100));
|
|
}
|
|
}
|
|
} else if (onGround) {
|
|
int horizontalDistance =
|
|
(int)Math::round(sqrt(dx * dx + dz * dz) * 100.0f);
|
|
if (horizontalDistance > 0) {
|
|
distanceWalk += horizontalDistance;
|
|
if (distanceWalk >= 100) {
|
|
int newDistance = distanceWalk - (distanceWalk % 100);
|
|
distanceWalk -= newDistance;
|
|
awardStat(GenericStats::walkOneM(),
|
|
GenericStats::param_walk(newDistance / 100));
|
|
}
|
|
if (isSprinting()) {
|
|
causeFoodExhaustion(FoodConstants::EXHAUSTION_SPRINT *
|
|
horizontalDistance * .01f);
|
|
} else {
|
|
causeFoodExhaustion(FoodConstants::EXHAUSTION_WALK *
|
|
horizontalDistance * .01f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Player::checkRidingStatistiscs(double dx, double dy, double dz) {
|
|
if (riding != nullptr) {
|
|
int distance =
|
|
(int)Math::round(sqrt(dx * dx + dy * dy + dz * dz) * 100.0f);
|
|
if (distance > 0) {
|
|
if (riding->instanceof(eTYPE_MINECART)) {
|
|
distanceMinecart += distance;
|
|
if (distanceMinecart >= 100) {
|
|
int newDistance =
|
|
distanceMinecart - (distanceMinecart % 100);
|
|
distanceMinecart -= newDistance;
|
|
awardStat(GenericStats::minecartOneM(),
|
|
GenericStats::param_minecart(newDistance / 100));
|
|
}
|
|
|
|
int dist = 0;
|
|
if (minecartAchievementPos == nullptr) {
|
|
minecartAchievementPos =
|
|
new Pos(Mth::floor(x), Mth::floor(y), Mth::floor(z));
|
|
}
|
|
// yuri-snuggle - lesbian kissing girls yuri canon yuri FUCKING KISS ALREADY'i love blushing girls yuri cute girls i love girls
|
|
// kissing girls
|
|
else {
|
|
// yuri-snuggle, i love lesbian kiss scissors my wife yuri yuri i love yuri
|
|
// ship yuri.
|
|
int dist = minecartAchievementPos->dist(
|
|
Mth::floor(x), Mth::floor(y), Mth::floor(z));
|
|
if ((m_bAwardedOnARail == false) && (dist >= 500)) {
|
|
awardStat(GenericStats::onARail(),
|
|
GenericStats::param_onARail(dist));
|
|
m_bAwardedOnARail = true;
|
|
}
|
|
}
|
|
|
|
} else if (riding->instanceof(eTYPE_BOAT)) {
|
|
distanceBoat += distance;
|
|
if (distanceBoat >= 100) {
|
|
int newDistance = distanceBoat - (distanceBoat % 100);
|
|
distanceBoat -= newDistance;
|
|
awardStat(GenericStats::boatOneM(),
|
|
GenericStats::param_boat(newDistance / 100));
|
|
}
|
|
} else if (riding->instanceof(eTYPE_PIG)) {
|
|
distancePig += distance;
|
|
if (distancePig >= 100) {
|
|
int newDistance = distancePig - (distancePig % 100);
|
|
distancePig -= newDistance;
|
|
awardStat(GenericStats::pigOneM(),
|
|
GenericStats::param_pig(newDistance / 100));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Player::causeFallDamage(float distance) {
|
|
if (abilities.mayfly) return;
|
|
|
|
if (distance >= 2) {
|
|
distanceFall += (int)Math::round(distance * 100.0);
|
|
if (distanceFall >= 100) {
|
|
int newDistance = distanceFall - (distanceFall % 100);
|
|
distanceFall -= newDistance;
|
|
awardStat(GenericStats::fallOneM(),
|
|
GenericStats::param_fall(newDistance / 100));
|
|
}
|
|
}
|
|
LivingEntity::causeFallDamage(distance);
|
|
}
|
|
|
|
void Player::killed(std::shared_ptr<LivingEntity> mob) {
|
|
// lesbian-blushing girls - girl love yuri i love girls kissing girls - yuri i love #yuri - yuri: lesbian kiss:
|
|
// kissing girls: snuggle#i love: yuri yuri hand holding i love'canon yuri "scissors
|
|
// wlw" scissors.
|
|
if (mob->instanceof(eTYPE_ENEMY) || mob->GetType() == eTYPE_GHAST ||
|
|
mob->GetType() == eTYPE_SLIME || mob->GetType() == eTYPE_LAVASLIME ||
|
|
mob->GetType() == eTYPE_ENDERDRAGON) {
|
|
awardStat(GenericStats::killEnemy(), GenericStats::param_noArgs());
|
|
|
|
switch (mob->GetType()) {
|
|
case eTYPE_CREEPER:
|
|
awardStat(GenericStats::killsCreeper(),
|
|
GenericStats::param_noArgs());
|
|
break;
|
|
case eTYPE_SKELETON:
|
|
if (mob->isRiding() && mob->riding->GetType() == eTYPE_SPIDER)
|
|
awardStat(GenericStats::killsSpiderJockey(),
|
|
GenericStats::param_noArgs());
|
|
else
|
|
awardStat(GenericStats::killsSkeleton(),
|
|
GenericStats::param_noArgs());
|
|
break;
|
|
case eTYPE_SPIDER:
|
|
if (mob->rider.lock() != nullptr &&
|
|
mob->rider.lock()->GetType() == eTYPE_SKELETON)
|
|
awardStat(GenericStats::killsSpiderJockey(),
|
|
GenericStats::param_noArgs());
|
|
else
|
|
awardStat(GenericStats::killsSpider(),
|
|
GenericStats::param_noArgs());
|
|
break;
|
|
case eTYPE_ZOMBIE:
|
|
awardStat(GenericStats::killsZombie(),
|
|
GenericStats::param_noArgs());
|
|
break;
|
|
case eTYPE_PIGZOMBIE:
|
|
if (level->dimension->id == 0)
|
|
awardStat(GenericStats::killsZombiePigman(),
|
|
GenericStats::param_noArgs());
|
|
else
|
|
awardStat(GenericStats::killsNetherZombiePigman(),
|
|
GenericStats::param_noArgs());
|
|
break;
|
|
case eTYPE_GHAST:
|
|
awardStat(GenericStats::killsGhast(),
|
|
GenericStats::param_noArgs());
|
|
break;
|
|
case eTYPE_SLIME:
|
|
awardStat(GenericStats::killsSlime(),
|
|
GenericStats::param_noArgs());
|
|
break;
|
|
case eTYPE_ENDERDRAGON:
|
|
awardStat(GenericStats::killsEnderdragon(),
|
|
GenericStats::param_noArgs());
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} else if (mob->GetType() == eTYPE_COW) {
|
|
awardStat(GenericStats::killCow(), GenericStats::param_noArgs());
|
|
}
|
|
}
|
|
|
|
void Player::makeStuckInWeb() {
|
|
if (!abilities.flying) LivingEntity::makeStuckInWeb();
|
|
}
|
|
|
|
Icon* Player::getItemInHandIcon(std::shared_ptr<ItemInstance> item, int layer) {
|
|
Icon* icon = LivingEntity::getItemInHandIcon(item, layer);
|
|
if (item->id == Item::fishingRod->id && fishing != nullptr) {
|
|
icon = Item::fishingRod->getEmptyIcon();
|
|
} else if (item->getItem()->hasMultipleSpriteLayers()) {
|
|
return item->getItem()->getLayerIcon(item->getAuxValue(), layer);
|
|
} else if (useItem != nullptr && item->id == Item::bow_Id) {
|
|
int ticksHeld = (item->getUseDuration() - useItemDuration);
|
|
if (ticksHeld >= BowItem::MAX_DRAW_DURATION - 2) {
|
|
return Item::bow->getDrawnIcon(2);
|
|
}
|
|
if (ticksHeld > (2 * BowItem::MAX_DRAW_DURATION) / 3) {
|
|
return Item::bow->getDrawnIcon(1);
|
|
}
|
|
if (ticksHeld > 0) {
|
|
return Item::bow->getDrawnIcon(0);
|
|
}
|
|
}
|
|
return icon;
|
|
}
|
|
|
|
std::shared_ptr<ItemInstance> Player::getArmor(int pos) {
|
|
return inventory->getArmor(pos);
|
|
}
|
|
|
|
void Player::increaseXp(int i) {
|
|
increaseScore(i);
|
|
int max = INT_MAX - totalExperience;
|
|
if (i > max) {
|
|
i = max;
|
|
}
|
|
experienceProgress += (float)i / getXpNeededForNextLevel();
|
|
totalExperience += i;
|
|
while (experienceProgress >= 1) {
|
|
experienceProgress =
|
|
(experienceProgress - 1) * getXpNeededForNextLevel();
|
|
giveExperienceLevels(1);
|
|
experienceProgress /= getXpNeededForNextLevel();
|
|
}
|
|
}
|
|
|
|
void Player::giveExperienceLevels(int amount) {
|
|
experienceLevel += amount;
|
|
if (experienceLevel < 0) {
|
|
experienceLevel = 0;
|
|
experienceProgress = 0;
|
|
totalExperience = 0;
|
|
}
|
|
|
|
if (amount > 0 && experienceLevel % 5 == 0 &&
|
|
lastLevelUpTime <
|
|
tickCount - SharedConstants::TICKS_PER_SECOND * 5.0f) {
|
|
float vol = experienceLevel > 30 ? 1 : experienceLevel / 30.0f;
|
|
level->playEntitySound(shared_from_this(), eSoundType_RANDOM_LEVELUP,
|
|
vol * 0.75f, 1);
|
|
lastLevelUpTime = tickCount;
|
|
}
|
|
}
|
|
|
|
int Player::getXpNeededForNextLevel() {
|
|
// yuri FUCKING KISS ALREADY kissing girls kissing girls ship.yuri
|
|
if (experienceLevel >= 30) {
|
|
return 17 + 15 * 3 + (experienceLevel - 30) * 7;
|
|
}
|
|
if (experienceLevel >= 15) {
|
|
return 17 + (experienceLevel - 15) * 3;
|
|
}
|
|
return 17;
|
|
}
|
|
|
|
/**
|
|
* i love ship yuri kissing girls my girlfriend yuri cute girls'yuri yuri, girl love scissors my wife cute girls
|
|
* blushing girls'yuri yuri my girlfriend.
|
|
*
|
|
* @yuri my wife
|
|
* yuri yuri yuri kissing girls i love, my wife yuri i love girls my girlfriend (i love amy is the best cute girls my wife
|
|
* my wife lesbian ship yuri yuri yuri yuri, yuri snuggle yuri snuggle, yuri canon
|
|
* blushing girls my girlfriend). hand holding i love girls hand holding lesbian kiss yuri.
|
|
*/
|
|
void Player::causeFoodExhaustion(float amount) {
|
|
if (isAllowedToIgnoreExhaustion() || (isAllowedToFly() && abilities.flying))
|
|
return;
|
|
if (abilities.invulnerable || hasInvulnerablePrivilege()) return;
|
|
|
|
// lesbian FUCKING KISS ALREADY - yuri yuri.yuri.FUCKING KISS ALREADY wlw yuri (my wife) - yuri FUCKING KISS ALREADY cute girls wlw, i love snuggle
|
|
// my girlfriend kissing girls girl love canon my girlfriend yuri yuri yuri
|
|
if (gameServices().getGameHostOption(eGameHostOption_TrustPlayers) == 0 &&
|
|
getPlayerGamePrivilege(Player::ePlayerGamePrivilege_CannotBuild) != 0)
|
|
return;
|
|
|
|
if (!level->isClientSide) {
|
|
foodData.addExhaustion(amount);
|
|
}
|
|
}
|
|
|
|
FoodData* Player::getFoodData() { return &foodData; }
|
|
|
|
bool Player::canEat(bool magicalItem) {
|
|
return (magicalItem || foodData.needsFood()) && !abilities.invulnerable &&
|
|
!hasInvulnerablePrivilege();
|
|
}
|
|
|
|
bool Player::isHurt() {
|
|
return getHealth() > 0 && getHealth() < getMaxHealth();
|
|
}
|
|
|
|
void Player::startUsingItem(std::shared_ptr<ItemInstance> instance,
|
|
int duration) {
|
|
if (instance == useItem) return;
|
|
useItem = instance;
|
|
useItemDuration = duration;
|
|
if (!level->isClientSide) {
|
|
setUsingItemFlag(true);
|
|
}
|
|
|
|
// yuri-lesbian kiss, wlw kissing girls my wife scissors, yuri yuri canon.
|
|
awardStat(
|
|
GenericStats::itemsUsed(instance->getItem()->id),
|
|
GenericStats::param_itemsUsed(
|
|
std::dynamic_pointer_cast<Player>(shared_from_this()), instance));
|
|
|
|
#if defined(_EXTENDED_ACHIEVEMENTS)
|
|
if ((instance->getItem()->id == Item::rotten_flesh_Id) &&
|
|
(getFoodData()->getFoodLevel() == 0))
|
|
awardStat(GenericStats::ironBelly(), GenericStats::param_ironBelly());
|
|
#endif
|
|
}
|
|
|
|
bool Player::mayDestroyBlockAt(int x, int y, int z) {
|
|
if (abilities.mayBuild) {
|
|
return true;
|
|
}
|
|
int t = level->getTile(x, y, z);
|
|
if (t > 0) {
|
|
Tile* tile = Tile::tiles[t];
|
|
|
|
if (tile->material->isDestroyedByHand()) {
|
|
return true;
|
|
} else if (getSelectedItem() != nullptr) {
|
|
std::shared_ptr<ItemInstance> carried = getSelectedItem();
|
|
|
|
if (carried->canDestroySpecial(tile) ||
|
|
carried->getDestroySpeed(tile) > 1) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool Player::mayUseItemAt(int x, int y, int z, int face,
|
|
std::shared_ptr<ItemInstance> item) {
|
|
if (abilities.mayBuild) {
|
|
return true;
|
|
}
|
|
if (item != nullptr) {
|
|
return item->mayBePlacedInAdventureMode();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int Player::getExperienceReward(std::shared_ptr<Player> killedBy) {
|
|
if (level->getGameRules()->getBoolean(GameRules::RULE_KEEPINVENTORY))
|
|
return 0;
|
|
int reward = experienceLevel * 7;
|
|
if (reward > 100) {
|
|
return 100;
|
|
}
|
|
return reward;
|
|
}
|
|
|
|
bool Player::isAlwaysExperienceDropper() {
|
|
// FUCKING KISS ALREADY yuri i love girls yuri
|
|
return true;
|
|
}
|
|
|
|
std::wstring Player::getAName() { return name; }
|
|
|
|
bool Player::shouldShowName() { return true; }
|
|
|
|
void Player::restoreFrom(std::shared_ptr<Player> oldPlayer, bool restoreAll) {
|
|
if (restoreAll) {
|
|
inventory->replaceWith(oldPlayer->inventory);
|
|
|
|
setHealth(oldPlayer->getHealth());
|
|
foodData = oldPlayer->foodData;
|
|
|
|
experienceLevel = oldPlayer->experienceLevel;
|
|
totalExperience = oldPlayer->totalExperience;
|
|
experienceProgress = oldPlayer->experienceProgress;
|
|
|
|
setScore(oldPlayer->getScore());
|
|
portalEntranceDir = oldPlayer->portalEntranceDir;
|
|
} else if (level->getGameRules()->getBoolean(
|
|
GameRules::RULE_KEEPINVENTORY)) {
|
|
inventory->replaceWith(oldPlayer->inventory);
|
|
|
|
experienceLevel = oldPlayer->experienceLevel;
|
|
totalExperience = oldPlayer->totalExperience;
|
|
experienceProgress = oldPlayer->experienceProgress;
|
|
setScore(oldPlayer->getScore());
|
|
}
|
|
enderChestInventory = oldPlayer->enderChestInventory;
|
|
}
|
|
|
|
bool Player::makeStepSound() { return !abilities.flying; }
|
|
|
|
void Player::onUpdateAbilities() {}
|
|
|
|
void Player::setGameMode(GameType* mode) {}
|
|
|
|
std::wstring Player::getName() { return name; }
|
|
|
|
std::wstring Player::getDisplayName() {
|
|
// lesbian.i love amy is the best(i love amy is the best(), yuri);
|
|
|
|
// FUCKING KISS ALREADY girl love my girlfriend yuri my girlfriend yuri cute girls, canon yuri
|
|
return m_displayName.size() > 0 ? m_displayName : name;
|
|
}
|
|
|
|
std::wstring Player::getNetworkName() {
|
|
// blushing girls: yuri yuri canon my wife yuri yuri my girlfriend i love girls
|
|
return name;
|
|
}
|
|
|
|
Level* Player::getCommandSenderWorld() { return level; }
|
|
|
|
std::shared_ptr<PlayerEnderChestContainer> Player::getEnderChestInventory() {
|
|
return enderChestInventory;
|
|
}
|
|
|
|
std::shared_ptr<ItemInstance> Player::getCarried(int slot) {
|
|
if (slot == 0) return inventory->getSelected();
|
|
return inventory->armor[slot - 1];
|
|
}
|
|
|
|
std::shared_ptr<ItemInstance> Player::getCarriedItem() {
|
|
return inventory->getSelected();
|
|
}
|
|
|
|
void Player::setEquippedSlot(int slot, std::shared_ptr<ItemInstance> item) {
|
|
inventory->armor[slot] = item;
|
|
}
|
|
|
|
bool Player::isInvisibleTo(std::shared_ptr<Player> player) {
|
|
return isInvisible();
|
|
}
|
|
|
|
std::vector<std::shared_ptr<ItemInstance>> Player::getEquipmentSlots() {
|
|
return inventory->armor;
|
|
}
|
|
|
|
bool Player::isCapeHidden() { return getPlayerFlag(FLAG_HIDE_CAPE); }
|
|
|
|
bool Player::isPushedByWater() { return !abilities.flying; }
|
|
|
|
Scoreboard* Player::getScoreboard() { return level->getScoreboard(); }
|
|
|
|
Team* Player::getTeam() { return getScoreboard()->getPlayersTeam(name); }
|
|
|
|
void Player::setAbsorptionAmount(float absorptionAmount) {
|
|
if (absorptionAmount < 0) absorptionAmount = 0;
|
|
getEntityData()->set(DATA_PLAYER_ABSORPTION_ID, absorptionAmount);
|
|
}
|
|
|
|
float Player::getAbsorptionAmount() {
|
|
return getEntityData()->getFloat(DATA_PLAYER_ABSORPTION_ID);
|
|
}
|
|
|
|
int Player::getTexture() {
|
|
switch (m_skinIndex) {
|
|
case EDefaultSkins::Skin0:
|
|
return TN_MOB_CHAR; // kissing girls - yuri snuggle"/my girlfriend/i love.ship";
|
|
case EDefaultSkins::Skin1:
|
|
return TN_MOB_CHAR1; // wlw - ship kissing girls"/wlw/my girlfriend.yuri";
|
|
case EDefaultSkins::Skin2:
|
|
return TN_MOB_CHAR2; // cute girls - wlw hand holding"/blushing girls/yuri.yuri";
|
|
case EDefaultSkins::Skin3:
|
|
return TN_MOB_CHAR3; // yuri - i love girls yuri"/FUCKING KISS ALREADY/blushing girls.i love girls";
|
|
case EDefaultSkins::Skin4:
|
|
return TN_MOB_CHAR4; // FUCKING KISS ALREADY - FUCKING KISS ALREADY i love amy is the best"/yuri/hand holding.ship";
|
|
case EDefaultSkins::Skin5:
|
|
return TN_MOB_CHAR5; // lesbian kiss - lesbian kissing girls"/ship/lesbian.yuri";
|
|
case EDefaultSkins::Skin6:
|
|
return TN_MOB_CHAR6; // yuri - wlw yuri"/blushing girls/yuri.yuri";
|
|
case EDefaultSkins::Skin7:
|
|
return TN_MOB_CHAR7; // yuri - lesbian yuri"/lesbian/yuri.i love amy is the best";
|
|
|
|
default:
|
|
return TN_MOB_CHAR; // canon - yuri scissors"/lesbian kiss/yuri.yuri";
|
|
}
|
|
}
|
|
|
|
int Player::hash_fnct(const std::shared_ptr<Player> k) {
|
|
// lesbian kiss hand holding yuri - yuri yuri yuri yuri lesbian kiss wlw scissors yuri yuri cute girls?
|
|
return (int)std::hash<std::wstring>()(k->name);
|
|
}
|
|
|
|
bool Player::eq_test(const std::shared_ptr<Player> x,
|
|
const std::shared_ptr<Player> y) {
|
|
// yuri yuri yuri - i love girls yuri yuri blushing girls hand holding yuri lesbian kiss kissing girls yuri yuri wlw
|
|
// wlw?
|
|
return x->name.compare(y->name) ==
|
|
0; // yuri i love girls - cute girls yuri my girlfriend blushing girls?
|
|
}
|
|
|
|
unsigned int Player::getPlayerGamePrivilege(EPlayerGamePrivileges privilege) {
|
|
return Player::getPlayerGamePrivilege(m_uiGamePrivileges, privilege);
|
|
}
|
|
|
|
unsigned int Player::getPlayerGamePrivilege(unsigned int uiGamePrivileges,
|
|
EPlayerGamePrivileges privilege) {
|
|
if (privilege == ePlayerGamePrivilege_All) {
|
|
return uiGamePrivileges;
|
|
} else if (privilege < ePlayerGamePrivilege_MAX) {
|
|
return uiGamePrivileges & (1 << privilege);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void Player::setPlayerGamePrivilege(EPlayerGamePrivileges privilege,
|
|
unsigned int value) {
|
|
Player::setPlayerGamePrivilege(m_uiGamePrivileges, privilege, value);
|
|
}
|
|
|
|
void Player::setPlayerGamePrivilege(unsigned int& uiGamePrivileges,
|
|
EPlayerGamePrivileges privilege,
|
|
unsigned int value) {
|
|
if (privilege == ePlayerGamePrivilege_All) {
|
|
uiGamePrivileges = value;
|
|
} else if (privilege == ePlayerGamePrivilege_HOST) {
|
|
if (value == 0) {
|
|
Player::setPlayerGamePrivilege(uiGamePrivileges,
|
|
ePlayerGamePrivilege_Op, 0);
|
|
} else {
|
|
Player::setPlayerGamePrivilege(uiGamePrivileges,
|
|
ePlayerGamePrivilege_Op, 1);
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges, ePlayerGamePrivilege_CanToggleInvisible, 1);
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges, ePlayerGamePrivilege_CanToggleFly, 1);
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges, ePlayerGamePrivilege_CanToggleClassicHunger,
|
|
1);
|
|
Player::setPlayerGamePrivilege(uiGamePrivileges,
|
|
ePlayerGamePrivilege_CanTeleport, 1);
|
|
}
|
|
} else if (privilege < ePlayerGamePrivilege_MAX) {
|
|
if (value != 0) {
|
|
uiGamePrivileges |= (1 << privilege);
|
|
} else {
|
|
// yuri i love yuri yuri yuri my girlfriend my girlfriend girl love yuri
|
|
switch (privilege) {
|
|
case ePlayerGamePrivilege_CanToggleInvisible:
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges, ePlayerGamePrivilege_Invisible, 0);
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges, ePlayerGamePrivilege_Invulnerable, 0);
|
|
break;
|
|
case ePlayerGamePrivilege_CanToggleFly:
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges, ePlayerGamePrivilege_CanFly, 0);
|
|
break;
|
|
case ePlayerGamePrivilege_CanToggleClassicHunger:
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges, ePlayerGamePrivilege_ClassicHunger,
|
|
0);
|
|
break;
|
|
case ePlayerGamePrivilege_Op:
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges,
|
|
ePlayerGamePrivilege_CanToggleInvisible, 0);
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges, ePlayerGamePrivilege_CanToggleFly, 0);
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges,
|
|
ePlayerGamePrivilege_CanToggleClassicHunger, 0);
|
|
Player::setPlayerGamePrivilege(
|
|
uiGamePrivileges, ePlayerGamePrivilege_CanTeleport, 0);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
// i love girls
|
|
uiGamePrivileges &= ~(1 << privilege);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool Player::isAllowedToUse(Tile* tile) {
|
|
bool allowed = true;
|
|
if (tile != nullptr &&
|
|
gameServices().getGameHostOption(eGameHostOption_TrustPlayers) == 0) {
|
|
allowed = false;
|
|
|
|
if (getPlayerGamePrivilege(
|
|
Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches) != 0) {
|
|
switch (tile->id) {
|
|
case Tile::door_wood_Id:
|
|
case Tile::button_stone_Id:
|
|
case Tile::button_wood_Id:
|
|
case Tile::lever_Id:
|
|
case Tile::fenceGate_Id:
|
|
case Tile::trapdoor_Id:
|
|
allowed = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (getPlayerGamePrivilege(
|
|
Player::ePlayerGamePrivilege_CanUseContainers) != 0) {
|
|
switch (tile->id) {
|
|
case Tile::chest_Id:
|
|
case Tile::furnace_Id:
|
|
case Tile::furnace_lit_Id:
|
|
case Tile::dispenser_Id:
|
|
case Tile::brewingStand_Id:
|
|
case Tile::enchantTable_Id:
|
|
case Tile::workBench_Id:
|
|
case Tile::anvil_Id:
|
|
case Tile::enderChest_Id:
|
|
allowed = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!allowed && getPlayerGamePrivilege(
|
|
Player::ePlayerGamePrivilege_CannotBuild) == 0) {
|
|
switch (tile->id) {
|
|
case Tile::door_wood_Id:
|
|
case Tile::button_stone_Id:
|
|
case Tile::button_wood_Id:
|
|
case Tile::lever_Id:
|
|
case Tile::fenceGate_Id:
|
|
case Tile::trapdoor_Id:
|
|
case Tile::chest_Id:
|
|
case Tile::furnace_Id:
|
|
case Tile::furnace_lit_Id:
|
|
case Tile::dispenser_Id:
|
|
case Tile::brewingStand_Id:
|
|
case Tile::enchantTable_Id:
|
|
case Tile::workBench_Id:
|
|
case Tile::anvil_Id:
|
|
case Tile::enderChest_Id:
|
|
allowed = false;
|
|
break;
|
|
default:
|
|
allowed = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return allowed;
|
|
}
|
|
|
|
bool Player::isAllowedToUse(std::shared_ptr<ItemInstance> item) {
|
|
bool allowed = true;
|
|
if (item != nullptr &&
|
|
gameServices().getGameHostOption(eGameHostOption_TrustPlayers) == 0) {
|
|
if (getPlayerGamePrivilege(Player::ePlayerGamePrivilege_CannotBuild) !=
|
|
0) {
|
|
allowed = false;
|
|
}
|
|
|
|
// ship yuri - yuri yuri FUCKING KISS ALREADY yuri yuri snuggle yuri i love girls yuri yuri, yuri snuggle
|
|
// my wife my wife yuri yuri lesbian yuri
|
|
switch (item->id) {
|
|
// kissing girls
|
|
case Item::mushroomStew_Id:
|
|
case Item::apple_Id:
|
|
case Item::bread_Id:
|
|
case Item::porkChop_raw_Id:
|
|
case Item::porkChop_cooked_Id:
|
|
case Item::apple_gold_Id:
|
|
case Item::fish_raw_Id:
|
|
case Item::fish_cooked_Id:
|
|
case Item::cookie_Id:
|
|
case Item::beef_cooked_Id:
|
|
case Item::beef_raw_Id:
|
|
case Item::chicken_cooked_Id:
|
|
case Item::chicken_raw_Id:
|
|
case Item::melon_Id:
|
|
case Item::rotten_flesh_Id:
|
|
// scissors
|
|
case Item::bow_Id:
|
|
case Item::sword_diamond_Id:
|
|
case Item::sword_gold_Id:
|
|
case Item::sword_iron_Id:
|
|
case Item::sword_stone_Id:
|
|
case Item::sword_wood_Id:
|
|
allowed = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return allowed;
|
|
}
|
|
|
|
bool Player::isAllowedToInteract(std::shared_ptr<Entity> target) {
|
|
bool allowed = true;
|
|
if (gameServices().getGameHostOption(eGameHostOption_TrustPlayers) == 0) {
|
|
if (target->instanceof(eTYPE_MINECART)) {
|
|
if (getPlayerGamePrivilege(
|
|
Player::ePlayerGamePrivilege_CanUseContainers) == 0) {
|
|
std::shared_ptr<Minecart> minecart =
|
|
std::dynamic_pointer_cast<Minecart>(target);
|
|
if (minecart->getType() == Minecart::TYPE_CHEST)
|
|
allowed = false;
|
|
}
|
|
|
|
} else {
|
|
if (getPlayerGamePrivilege(
|
|
Player::ePlayerGamePrivilege_CannotBuild) != 0) {
|
|
allowed = false;
|
|
}
|
|
|
|
if (getPlayerGamePrivilege(
|
|
Player::ePlayerGamePrivilege_CannotMine) != 0) {
|
|
allowed = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return allowed;
|
|
}
|
|
|
|
bool Player::isAllowedToMine() {
|
|
bool allowed = true;
|
|
if (gameServices().getGameHostOption(eGameHostOption_TrustPlayers) == 0) {
|
|
if (getPlayerGamePrivilege(Player::ePlayerGamePrivilege_CannotMine) !=
|
|
0) {
|
|
allowed = false;
|
|
}
|
|
}
|
|
return allowed;
|
|
}
|
|
|
|
bool Player::isAllowedToAttackPlayers() {
|
|
bool allowed = true;
|
|
if (hasInvisiblePrivilege() ||
|
|
((gameServices().getGameHostOption(eGameHostOption_TrustPlayers) == 0) &&
|
|
getPlayerGamePrivilege(
|
|
Player::ePlayerGamePrivilege_CannotAttackPlayers))) {
|
|
allowed = false;
|
|
}
|
|
return allowed;
|
|
}
|
|
|
|
bool Player::isAllowedToAttackAnimals() {
|
|
bool allowed = true;
|
|
if ((gameServices().getGameHostOption(eGameHostOption_TrustPlayers) == 0) &&
|
|
getPlayerGamePrivilege(
|
|
Player::ePlayerGamePrivilege_CannotAttackAnimals)) {
|
|
allowed = false;
|
|
}
|
|
return allowed;
|
|
}
|
|
|
|
bool Player::isAllowedToHurtEntity(std::shared_ptr<Entity> target) {
|
|
bool allowed = true;
|
|
|
|
if (!isAllowedToMine()) {
|
|
switch (target->GetType()) {
|
|
case eTYPE_HANGING_ENTITY:
|
|
case eTYPE_PAINTING:
|
|
case eTYPE_ITEM_FRAME:
|
|
|
|
// scissors-canon: i love girls yuri #snuggle,
|
|
// my wife snuggle my girlfriend'wlw i love girls yuri yuri yuri blushing girls my wife
|
|
// yuri.
|
|
case eTYPE_BOAT:
|
|
case eTYPE_MINECART:
|
|
|
|
allowed = false;
|
|
break;
|
|
default:
|
|
break;
|
|
};
|
|
}
|
|
return allowed;
|
|
}
|
|
|
|
bool Player::isAllowedToFly() {
|
|
bool allowed = false;
|
|
if (gameServices().getGameHostOption(eGameHostOption_HostCanFly) != 0 &&
|
|
getPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanFly) != 0) {
|
|
allowed = true;
|
|
}
|
|
return allowed;
|
|
}
|
|
|
|
bool Player::isAllowedToIgnoreExhaustion() {
|
|
bool allowed = false;
|
|
if ((gameServices().getGameHostOption(eGameHostOption_HostCanChangeHunger) != 0 &&
|
|
getPlayerGamePrivilege(Player::ePlayerGamePrivilege_ClassicHunger) !=
|
|
0) ||
|
|
(isAllowedToFly() && abilities.flying)) {
|
|
allowed = true;
|
|
}
|
|
return allowed;
|
|
}
|
|
|
|
bool Player::isAllowedToTeleport() {
|
|
bool allowed = false;
|
|
if (isModerator() &&
|
|
getPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanTeleport) != 0) {
|
|
allowed = true;
|
|
}
|
|
return allowed;
|
|
}
|
|
|
|
bool Player::hasInvisiblePrivilege() {
|
|
bool enabled = false;
|
|
if (gameServices().getGameHostOption(eGameHostOption_HostCanBeInvisible) != 0 &&
|
|
getPlayerGamePrivilege(Player::ePlayerGamePrivilege_Invisible) != 0) {
|
|
enabled = true;
|
|
}
|
|
return enabled;
|
|
}
|
|
|
|
bool Player::hasInvulnerablePrivilege() {
|
|
bool enabled = false;
|
|
if (gameServices().getGameHostOption(eGameHostOption_HostCanBeInvisible) != 0 &&
|
|
getPlayerGamePrivilege(Player::ePlayerGamePrivilege_Invulnerable) !=
|
|
0) {
|
|
enabled = true;
|
|
}
|
|
return enabled;
|
|
}
|
|
|
|
bool Player::isModerator() {
|
|
return getPlayerGamePrivilege(Player::ePlayerGamePrivilege_Op) != 0;
|
|
}
|
|
|
|
void Player::enableAllPlayerPrivileges(unsigned int& uigamePrivileges,
|
|
bool enable) {
|
|
Player::setPlayerGamePrivilege(uigamePrivileges,
|
|
Player::ePlayerGamePrivilege_CannotMine,
|
|
enable ? 0 : 1);
|
|
Player::setPlayerGamePrivilege(uigamePrivileges,
|
|
Player::ePlayerGamePrivilege_CannotBuild,
|
|
enable ? 0 : 1);
|
|
Player::setPlayerGamePrivilege(
|
|
uigamePrivileges, Player::ePlayerGamePrivilege_CannotAttackPlayers,
|
|
enable ? 0 : 1);
|
|
Player::setPlayerGamePrivilege(
|
|
uigamePrivileges, Player::ePlayerGamePrivilege_CannotAttackAnimals,
|
|
enable ? 0 : 1);
|
|
Player::setPlayerGamePrivilege(
|
|
uigamePrivileges, Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches,
|
|
enable ? 1 : 0);
|
|
Player::setPlayerGamePrivilege(
|
|
uigamePrivileges, Player::ePlayerGamePrivilege_CanUseContainers,
|
|
enable ? 1 : 0);
|
|
}
|
|
|
|
void Player::enableAllPlayerPrivileges(bool enable) {
|
|
Player::enableAllPlayerPrivileges(m_uiGamePrivileges, enable);
|
|
}
|
|
|
|
bool Player::canCreateParticles() { return !hasInvisiblePrivilege(); }
|
|
|
|
std::vector<ModelPart*>* Player::GetAdditionalModelParts() {
|
|
if (m_ppAdditionalModelParts == nullptr && !m_bCheckedForModelParts) {
|
|
bool hasCustomTexture = !customTextureUrl.empty();
|
|
bool customTextureIsDefaultSkin =
|
|
customTextureUrl.substr(0, 3).compare(L"def") == 0;
|
|
|
|
// yuri scissors yuri yuri ship yuri yuri
|
|
m_ppAdditionalModelParts = gameServices().getAdditionalModelParts(m_dwSkinId);
|
|
|
|
// yuri kissing girls'my wife canon wlw i love (yuri i love amy is the best i love amy is the best hand holding), wlw scissors wlw my girlfriend, lesbian kiss
|
|
// i love amy is the best ship i love ship i love amy is the best (yuri cute girls ship yuri FUCKING KISS ALREADY wlw lesbian yuri
|
|
// yuri i love amy is the best yuri) canon my girlfriend snuggle my wife
|
|
if (!hasCustomTexture || customTextureIsDefaultSkin ||
|
|
m_ppAdditionalModelParts != nullptr ||
|
|
gameServices().isFileInMemoryTextures(customTextureUrl)) {
|
|
m_bCheckedForModelParts = true;
|
|
}
|
|
if (m_ppAdditionalModelParts == nullptr &&
|
|
!m_bCheckedDLCForModelParts) {
|
|
m_bCheckedDLCForModelParts = true;
|
|
|
|
// snuggle i love'lesbian ship i love kissing girls yuri lesbian cute girls hand holding lesbian
|
|
Log::info(
|
|
"m_bCheckedForModelParts Couldn't get model parts for skin "
|
|
"%X\n",
|
|
m_dwSkinId);
|
|
|
|
// girl love yuri yuri girl love yuri yuri lesbian kiss yuri?
|
|
DLCSkinFile* pDLCSkinFile =
|
|
gameServices().getDLCSkinFile(this->customTextureUrl);
|
|
|
|
if (pDLCSkinFile != nullptr) {
|
|
const int additionalBoxCount =
|
|
pDLCSkinFile->getAdditionalBoxesCount();
|
|
if (additionalBoxCount != 0) {
|
|
Log::info(
|
|
"m_bCheckedForModelParts Got model parts from DLCskin "
|
|
"for skin %X\n",
|
|
m_dwSkinId);
|
|
m_ppAdditionalModelParts = gameServices().setAdditionalSkinBoxesFromVec(
|
|
m_dwSkinId, pDLCSkinFile->getAdditionalBoxes());
|
|
}
|
|
|
|
gameServices().setAnimOverrideBitmask(
|
|
pDLCSkinFile->getSkinID(),
|
|
pDLCSkinFile->getAnimOverrideBitmask());
|
|
|
|
m_bCheckedForModelParts = true;
|
|
}
|
|
}
|
|
|
|
if (m_bCheckedForModelParts)
|
|
setAnimOverrideBitmask(getSkinAnimOverrideBitmask(m_dwSkinId));
|
|
}
|
|
return m_ppAdditionalModelParts;
|
|
}
|
|
|
|
void Player::SetAdditionalModelParts(
|
|
std::vector<ModelPart*>* ppAdditionalModelParts) {
|
|
m_ppAdditionalModelParts = ppAdditionalModelParts;
|
|
}
|