mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 18:13:46 +01:00
Display which tool the player is holding
And some simple animation when trying to dig...
This commit is contained in:
parent
5c1074aa7d
commit
f31b0a3361
@ -2008,6 +2008,14 @@ v3f Client::getPlayerPosition(v3f *eye_position)
|
|||||||
return player->getPosition();
|
return player->getPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::setPlayerWield(scene::ISceneNode *wield)
|
||||||
|
{
|
||||||
|
//JMutexAutoLock envlock(m_env_mutex); //bulk comment-out
|
||||||
|
LocalPlayer *player = m_env.getLocalPlayer();
|
||||||
|
assert(player != NULL);
|
||||||
|
player->wield = wield;
|
||||||
|
}
|
||||||
|
|
||||||
void Client::setPlayerControl(PlayerControl &control)
|
void Client::setPlayerControl(PlayerControl &control)
|
||||||
{
|
{
|
||||||
//JMutexAutoLock envlock(m_env_mutex); //bulk comment-out
|
//JMutexAutoLock envlock(m_env_mutex); //bulk comment-out
|
||||||
|
@ -210,6 +210,7 @@ public:
|
|||||||
// eye position in *eye_position
|
// eye position in *eye_position
|
||||||
v3f getPlayerPosition(v3f *eye_position=NULL);
|
v3f getPlayerPosition(v3f *eye_position=NULL);
|
||||||
|
|
||||||
|
void setPlayerWield(scene::ISceneNode *wield);
|
||||||
void setPlayerControl(PlayerControl &control);
|
void setPlayerControl(PlayerControl &control);
|
||||||
|
|
||||||
void selectPlayerItem(u16 item);
|
void selectPlayerItem(u16 item);
|
||||||
|
60
src/game.cpp
60
src/game.cpp
@ -956,7 +956,10 @@ void the_game(
|
|||||||
v3f(BS*100, BS*2, BS*100), // Look from
|
v3f(BS*100, BS*2, BS*100), // Look from
|
||||||
v3f(BS*100+1, BS*2, BS*100), // Look to
|
v3f(BS*100+1, BS*2, BS*100), // Look to
|
||||||
-1 // Camera ID
|
-1 // Camera ID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Do this so children rotate accordingly (tool)
|
||||||
|
camera->bindTargetAndRotation(true);
|
||||||
|
|
||||||
if(camera == NULL)
|
if(camera == NULL)
|
||||||
{
|
{
|
||||||
@ -972,6 +975,44 @@ void the_game(
|
|||||||
f32 camera_yaw = 0; // "right/left"
|
f32 camera_yaw = 0; // "right/left"
|
||||||
f32 camera_pitch = 0; // "up/down"
|
f32 camera_pitch = 0; // "up/down"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tool
|
||||||
|
*/
|
||||||
|
|
||||||
|
v3f tool_wield_position(0.6, -0.6, 1.0);
|
||||||
|
v3f tool_wield_rotation(-25, 180, -25);
|
||||||
|
float tool_wield_animation = 0.0;
|
||||||
|
scene::IMeshSceneNode *tool_wield;
|
||||||
|
{
|
||||||
|
scene::SMesh *mesh = new scene::SMesh();
|
||||||
|
scene::IMeshBuffer *buf = new scene::SMeshBuffer();
|
||||||
|
video::SColor c(255,255,255,255);
|
||||||
|
video::S3DVertex vertices[4] =
|
||||||
|
{
|
||||||
|
video::S3DVertex(-0.5,0,0, 0,0,0, c, 0,1),
|
||||||
|
video::S3DVertex(0.5,0,0, 0,0,0, c, 1,1),
|
||||||
|
video::S3DVertex(0.5,0.5,0, 0,0,0, c, 1,0),
|
||||||
|
video::S3DVertex(-0.5,0.5,0, 0,0,0, c, 0,0),
|
||||||
|
};
|
||||||
|
u16 indices[] = {0,1,2,2,3,0};
|
||||||
|
buf->append(vertices, 4, indices, 6);
|
||||||
|
// Set material
|
||||||
|
buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
|
||||||
|
buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
|
||||||
|
buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
||||||
|
// Add to mesh
|
||||||
|
mesh->addMeshBuffer(buf);
|
||||||
|
buf->drop();
|
||||||
|
|
||||||
|
tool_wield = smgr->addMeshSceneNode(mesh, camera);
|
||||||
|
mesh->drop();
|
||||||
|
}
|
||||||
|
tool_wield->setVisible(false);
|
||||||
|
tool_wield->setPosition(tool_wield_position);
|
||||||
|
tool_wield->setRotation(tool_wield_rotation);
|
||||||
|
|
||||||
|
client.setPlayerWield(tool_wield);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Clouds
|
Clouds
|
||||||
*/
|
*/
|
||||||
@ -1920,6 +1961,7 @@ void the_game(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(input->getRightClicked())
|
if(input->getRightClicked())
|
||||||
{
|
{
|
||||||
std::cout<<DTIME<<"Ground right-clicked"<<std::endl;
|
std::cout<<DTIME<<"Ground right-clicked"<<std::endl;
|
||||||
@ -1986,6 +2028,14 @@ void the_game(
|
|||||||
else{
|
else{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(input->getLeftState())
|
||||||
|
// Tool animation loops 0.0 - 1.0
|
||||||
|
tool_wield_animation = fmod(tool_wield_animation + dtime * 3.0, 1.0);
|
||||||
|
else
|
||||||
|
// Return tool to holding position if not digging
|
||||||
|
tool_wield_animation /= 1.5;
|
||||||
|
|
||||||
} // selected_object == NULL
|
} // selected_object == NULL
|
||||||
|
|
||||||
input->resetLeftClicked();
|
input->resetLeftClicked();
|
||||||
@ -2103,6 +2153,14 @@ void the_game(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Animate tool
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
tool_wield->setRotation(tool_wield_rotation - sin(tool_wield_animation * PI) * 40.0);
|
||||||
|
tool_wield->setPosition(tool_wield_position - sin(tool_wield_animation * PI) / 3.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Update gui stuff (0ms)
|
Update gui stuff (0ms)
|
||||||
|
@ -53,6 +53,10 @@ public:
|
|||||||
// Shall make an exact clone of the item
|
// Shall make an exact clone of the item
|
||||||
virtual InventoryItem* clone() = 0;
|
virtual InventoryItem* clone() = 0;
|
||||||
#ifndef SERVER
|
#ifndef SERVER
|
||||||
|
// Return the name of the image for this item
|
||||||
|
virtual std::string getBasename() { return ""; }
|
||||||
|
// Shall return an image of the item (or NULL)
|
||||||
|
virtual video::ITexture * getImageRaw() { return NULL; }
|
||||||
// Shall return an image to show in the GUI (or NULL)
|
// Shall return an image to show in the GUI (or NULL)
|
||||||
virtual video::ITexture * getImage() { return NULL; }
|
virtual video::ITexture * getImage() { return NULL; }
|
||||||
#endif
|
#endif
|
||||||
@ -353,40 +357,53 @@ public:
|
|||||||
return new ToolItem(m_toolname, m_wear);
|
return new ToolItem(m_toolname, m_wear);
|
||||||
}
|
}
|
||||||
#ifndef SERVER
|
#ifndef SERVER
|
||||||
|
std::string getBasename() {
|
||||||
|
if(m_toolname == "WPick")
|
||||||
|
return "tool_woodpick.png";
|
||||||
|
else if(m_toolname == "STPick")
|
||||||
|
return "tool_stonepick.png";
|
||||||
|
else if(m_toolname == "SteelPick")
|
||||||
|
return "tool_steelpick.png";
|
||||||
|
else if(m_toolname == "MesePick")
|
||||||
|
return "tool_mesepick.png";
|
||||||
|
else if(m_toolname == "WShovel")
|
||||||
|
return "tool_woodshovel.png";
|
||||||
|
else if(m_toolname == "STShovel")
|
||||||
|
return "tool_stoneshovel.png";
|
||||||
|
else if(m_toolname == "SteelShovel")
|
||||||
|
return "tool_steelshovel.png";
|
||||||
|
else if(m_toolname == "WAxe")
|
||||||
|
return "tool_woodaxe.png";
|
||||||
|
else if(m_toolname == "STAxe")
|
||||||
|
return "tool_stoneaxe.png";
|
||||||
|
else if(m_toolname == "SteelAxe")
|
||||||
|
return "tool_steelaxe.png";
|
||||||
|
else if(m_toolname == "WSword")
|
||||||
|
return "tool_woodsword.png";
|
||||||
|
else if(m_toolname == "STSword")
|
||||||
|
return "tool_stonesword.png";
|
||||||
|
else if(m_toolname == "SteelSword")
|
||||||
|
return "tool_steelsword.png";
|
||||||
|
else
|
||||||
|
return "cloud.png";
|
||||||
|
}
|
||||||
|
|
||||||
|
video::ITexture * getImageRaw()
|
||||||
|
{
|
||||||
|
if(g_texturesource == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return g_texturesource->getTextureRaw(getBasename());
|
||||||
|
}
|
||||||
|
|
||||||
video::ITexture * getImage()
|
video::ITexture * getImage()
|
||||||
{
|
{
|
||||||
if(g_texturesource == NULL)
|
if(g_texturesource == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
std::string basename;
|
std::string basename = getBasename();
|
||||||
if(m_toolname == "WPick")
|
|
||||||
basename = "tool_woodpick.png";
|
return g_texturesource->getTextureRaw(basename);
|
||||||
else if(m_toolname == "STPick")
|
|
||||||
basename = "tool_stonepick.png";
|
|
||||||
else if(m_toolname == "SteelPick")
|
|
||||||
basename = "tool_steelpick.png";
|
|
||||||
else if(m_toolname == "MesePick")
|
|
||||||
basename = "tool_mesepick.png";
|
|
||||||
else if(m_toolname == "WShovel")
|
|
||||||
basename = "tool_woodshovel.png";
|
|
||||||
else if(m_toolname == "STShovel")
|
|
||||||
basename = "tool_stoneshovel.png";
|
|
||||||
else if(m_toolname == "SteelShovel")
|
|
||||||
basename = "tool_steelshovel.png";
|
|
||||||
else if(m_toolname == "WAxe")
|
|
||||||
basename = "tool_woodaxe.png";
|
|
||||||
else if(m_toolname == "STAxe")
|
|
||||||
basename = "tool_stoneaxe.png";
|
|
||||||
else if(m_toolname == "SteelAxe")
|
|
||||||
basename = "tool_steelaxe.png";
|
|
||||||
else if(m_toolname == "WSword")
|
|
||||||
basename = "tool_woodsword.png";
|
|
||||||
else if(m_toolname == "STSword")
|
|
||||||
basename = "tool_stonesword.png";
|
|
||||||
else if(m_toolname == "SteelSword")
|
|
||||||
basename = "tool_steelsword.png";
|
|
||||||
else
|
|
||||||
basename = "cloud.png";
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Calculate a progress value with sane amount of
|
Calculate a progress value with sane amount of
|
||||||
|
@ -309,12 +309,31 @@ LocalPlayer::LocalPlayer():
|
|||||||
// Initialize hp to 0, so that no hearts will be shown if server
|
// Initialize hp to 0, so that no hearts will be shown if server
|
||||||
// doesn't support health points
|
// doesn't support health points
|
||||||
hp = 0;
|
hp = 0;
|
||||||
|
|
||||||
|
// No tool wielded initially
|
||||||
|
wield = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalPlayer::~LocalPlayer()
|
LocalPlayer::~LocalPlayer()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LocalPlayer::wieldItem(u16 item)
|
||||||
|
{
|
||||||
|
m_selected_item = item;
|
||||||
|
|
||||||
|
if(wield) {
|
||||||
|
InventoryItem* i = inventory.getList("main")->getItem(m_selected_item);
|
||||||
|
|
||||||
|
if(i && strcmp(i->getName(), "ToolItem") == 0) {
|
||||||
|
wield->getMaterial(0).setTexture(0, i->getImageRaw());
|
||||||
|
wield->setVisible(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
wield->setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
|
void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
|
||||||
core::list<CollisionInfo> *collision_info)
|
core::list<CollisionInfo> *collision_info)
|
||||||
{
|
{
|
||||||
|
@ -356,6 +356,8 @@ public:
|
|||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wieldItem(u16 item);
|
||||||
|
|
||||||
void move(f32 dtime, Map &map, f32 pos_max_d,
|
void move(f32 dtime, Map &map, f32 pos_max_d,
|
||||||
core::list<CollisionInfo> *collision_info);
|
core::list<CollisionInfo> *collision_info);
|
||||||
@ -365,6 +367,8 @@ public:
|
|||||||
|
|
||||||
PlayerControl control;
|
PlayerControl control;
|
||||||
|
|
||||||
|
scene::ISceneNode *wield;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// This is used for determining the sneaking range
|
// This is used for determining the sneaking range
|
||||||
v3s16 m_sneak_node;
|
v3s16 m_sneak_node;
|
||||||
|
Loading…
Reference in New Issue
Block a user