mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-24 09:01:20 +00:00
# Conflicts: # Minecraft.Client/Network/PlayerChunkMap.cpp # Minecraft.Client/Network/PlayerList.cpp # Minecraft.Client/Network/ServerChunkCache.cpp # Minecraft.Client/Platform/Common/Consoles_App.cpp # Minecraft.Client/Platform/Common/DLC/DLCManager.cpp # Minecraft.Client/Platform/Common/GameRules/LevelGenerationOptions.cpp # Minecraft.Client/Platform/Common/GameRules/LevelRuleset.cpp # Minecraft.Client/Platform/Common/Tutorial/Tutorial.cpp # Minecraft.Client/Platform/Common/Tutorial/TutorialTask.cpp # Minecraft.Client/Platform/Common/UI/IUIScene_CreativeMenu.cpp # Minecraft.Client/Platform/Common/UI/UIComponent_Panorama.cpp # Minecraft.Client/Platform/Common/UI/UIController.cpp # Minecraft.Client/Platform/Common/UI/UIController.h # Minecraft.Client/Platform/Extrax64Stubs.cpp # Minecraft.Client/Platform/Windows64/4JLibs/inc/4J_Input.h # Minecraft.Client/Platform/Windows64/4JLibs/inc/4J_Storage.h # Minecraft.Client/Player/EntityTracker.cpp # Minecraft.Client/Player/ServerPlayer.cpp # Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.cpp # Minecraft.Client/Textures/Packs/DLCTexturePack.cpp # Minecraft.Client/Textures/Stitching/StitchedTexture.cpp # Minecraft.Client/Textures/Stitching/TextureMap.cpp # Minecraft.Client/Textures/Textures.cpp # Minecraft.World/Blocks/NotGateTile.cpp # Minecraft.World/Blocks/PressurePlateTile.cpp # Minecraft.World/Blocks/TileEntities/PotionBrewing.cpp # Minecraft.World/Enchantments/EnchantmentHelper.cpp # Minecraft.World/Entities/HangingEntity.cpp # Minecraft.World/Entities/LeashFenceKnotEntity.cpp # Minecraft.World/Entities/LivingEntity.cpp # Minecraft.World/Entities/Mobs/Boat.cpp # Minecraft.World/Entities/Mobs/Minecart.cpp # Minecraft.World/Entities/Mobs/Witch.cpp # Minecraft.World/Entities/SyncedEntityData.cpp # Minecraft.World/Items/LeashItem.cpp # Minecraft.World/Items/PotionItem.cpp # Minecraft.World/Level/BaseMobSpawner.cpp # Minecraft.World/Level/CustomLevelSource.cpp # Minecraft.World/Level/Level.cpp # Minecraft.World/Level/Storage/DirectoryLevelStorage.cpp # Minecraft.World/Level/Storage/McRegionLevelStorage.cpp # Minecraft.World/Level/Storage/RegionFileCache.cpp # Minecraft.World/Player/Player.cpp # Minecraft.World/WorldGen/Biomes/BiomeCache.cpp # Minecraft.World/WorldGen/Features/RandomScatteredLargeFeature.cpp # Minecraft.World/WorldGen/Layers/BiomeOverrideLayer.cpp
138 lines
4.6 KiB
C++
138 lines
4.6 KiB
C++
#include "../Platform/stdafx.h"
|
|
#include "../Headers/net.minecraft.world.entity.player.h"
|
|
#include "../Headers/net.minecraft.world.entity.item.h"
|
|
#include "../Headers/net.minecraft.world.level.h"
|
|
#include "../Headers/net.minecraft.world.level.tile.h"
|
|
#include "../Headers/net.minecraft.world.phys.h"
|
|
#include "ItemInstance.h"
|
|
#include "Util/Vec3.h"
|
|
#include "BoatItem.h"
|
|
|
|
BoatItem::BoatItem(int id) : Item(id) { maxStackSize = 1; }
|
|
|
|
bool BoatItem::TestUse(std::shared_ptr<ItemInstance> itemInstance, Level* level,
|
|
std::shared_ptr<Player> player) {
|
|
// 4J-PB - added for tooltips to test use
|
|
// 4J TODO really we should have the crosshair hitresult telling us if it
|
|
// hit water, and at what distance, so we don't need to do this again if the
|
|
// player happens to have a boat in their hand
|
|
|
|
float xRot = player->xRotO + (player->xRot - player->xRotO);
|
|
float yRot = player->yRotO + (player->yRot - player->yRotO);
|
|
|
|
double x = player->xo + (player->x - player->xo);
|
|
double y =
|
|
player->yo + (player->y - player->yo) + 1.62 - player->heightOffset;
|
|
double z = player->zo + (player->z - player->zo);
|
|
|
|
Vec3 from(x, y, z);
|
|
|
|
float yCos = Mth::cos(-yRot * Mth::RAD_TO_GRAD - PI);
|
|
float ySin = Mth::sin(-yRot * Mth::RAD_TO_GRAD - PI);
|
|
float xCos = -Mth::cos(-xRot * Mth::RAD_TO_GRAD);
|
|
float xSin = Mth::sin(-xRot * Mth::RAD_TO_GRAD);
|
|
|
|
float xa = ySin * xCos;
|
|
float ya = xSin;
|
|
float za = yCos * xCos;
|
|
|
|
double range = 5;
|
|
Vec3 to(xa * range, ya * range, za * range);
|
|
to = to.add(from.x, from.y, from.z);
|
|
HitResult* hr = level->clip(&from, &to, true);
|
|
if (hr == nullptr) return false;
|
|
|
|
if (hr->type == HitResult::TILE) {
|
|
delete hr;
|
|
return true;
|
|
}
|
|
delete hr;
|
|
return false;
|
|
}
|
|
std::shared_ptr<ItemInstance> BoatItem::use(
|
|
std::shared_ptr<ItemInstance> itemInstance, Level* level,
|
|
std::shared_ptr<Player> player) {
|
|
float a = 1;
|
|
|
|
float xRot = player->xRotO + (player->xRot - player->xRotO) * a;
|
|
float yRot = player->yRotO + (player->yRot - player->yRotO) * a;
|
|
|
|
double x = player->xo + (player->x - player->xo) * a;
|
|
double y =
|
|
player->yo + (player->y - player->yo) * a + 1.62 - player->heightOffset;
|
|
double z = player->zo + (player->z - player->zo) * a;
|
|
|
|
Vec3 from(x, y, z);
|
|
|
|
float yCos = Mth::cos(-yRot * Mth::RAD_TO_GRAD - PI);
|
|
float ySin = Mth::sin(-yRot * Mth::RAD_TO_GRAD - PI);
|
|
float xCos = -Mth::cos(-xRot * Mth::RAD_TO_GRAD);
|
|
float xSin = Mth::sin(-xRot * Mth::RAD_TO_GRAD);
|
|
|
|
float xa = ySin * xCos;
|
|
float ya = xSin;
|
|
float za = yCos * xCos;
|
|
|
|
double range = 5;
|
|
Vec3 to(xa * range, ya * range, za * range);
|
|
to = to.add(from.x, from.y, from.z);
|
|
HitResult* hr = level->clip(&from, &to, true);
|
|
if (hr == nullptr) return itemInstance;
|
|
|
|
// check entity collision
|
|
Vec3 b = player->getViewVector(a);
|
|
bool hitEntity = false;
|
|
float overlap = 1;
|
|
AABB grown = player->bb.expand(b.x * (range), b.y * (range), b.z * (range))
|
|
.grow(overlap, overlap, overlap);
|
|
std::vector<std::shared_ptr<Entity> >* objects =
|
|
level->getEntities(player, &grown);
|
|
// for (int i = 0; i < objects.size(); i++) {
|
|
for (auto it = objects->begin(); it != objects->end(); ++it) {
|
|
std::shared_ptr<Entity> e = *it; // objects.get(i);
|
|
if (!e->isPickable()) continue;
|
|
|
|
float rr = e->getPickRadius();
|
|
AABB bb = e->bb.grow(rr, rr, rr);
|
|
if (bb.contains(from)) {
|
|
hitEntity = true;
|
|
}
|
|
}
|
|
if (hitEntity) {
|
|
return itemInstance;
|
|
}
|
|
|
|
if (hr->type == HitResult::TILE) {
|
|
int xt = hr->x;
|
|
int yt = hr->y;
|
|
int zt = hr->z;
|
|
|
|
if (level->getTile(xt, yt, zt) == Tile::topSnow_Id) yt--;
|
|
if (level->countInstanceOf(eTYPE_BOAT, true) <
|
|
Level::MAX_XBOX_BOATS) // 4J - added limit
|
|
{
|
|
std::shared_ptr<Boat> boat = std::shared_ptr<Boat>(
|
|
new Boat(level, xt + 0.5f, yt + 1.0f, zt + 0.5f));
|
|
boat->yRot =
|
|
((Mth::floor(player->yRot * 4.0F / 360.0F + 0.5) & 0x3) - 1) *
|
|
90;
|
|
AABB grown = boat->bb.grow(-0.1, -0.1, -0.1);
|
|
if (!level->getCubes(boat, &grown)->empty()) {
|
|
return itemInstance;
|
|
}
|
|
if (!level->isClientSide) {
|
|
level->addEntity(boat);
|
|
}
|
|
if (!player->abilities.instabuild) {
|
|
itemInstance->count--;
|
|
}
|
|
} else {
|
|
// display a message to say max boats has been hit
|
|
player->displayClientMessage(IDS_MAX_BOATS);
|
|
}
|
|
}
|
|
delete hr;
|
|
|
|
return itemInstance;
|
|
}
|