Compare commits
26 Commits
7e219419e0
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| e9061cbc5d | |||
| 041dfe138a | |||
| 22bdfba03e | |||
| 2c55301e7e | |||
| 4ae451d15e | |||
| 346e410cfd | |||
| f5f3af44e4 | |||
| ad7931a469 | |||
| 59562a6a9c | |||
| f607a3c454 | |||
| bcfc53e348 | |||
| 0c97b63c2a | |||
| 2fcfe46ba8 | |||
| 742042729b | |||
| bd677949e0 | |||
| 71f7143eab | |||
| fd6e8ed98a | |||
| 889b9f0b59 | |||
| c77289c9ca | |||
| 8c838a9dde | |||
| 40b29be85f | |||
| 4be1ca2850 | |||
| 34d92ffc2a | |||
| 7b277d1784 | |||
| 03b3c9e016 | |||
| 6cf29e9bde |
108
LICENSE.TXT
@@ -1,9 +1,113 @@
|
||||
MIT License
|
||||
For the files located in mods/shit_mods_redo and mods/player_api please see the license files in those directories.
|
||||
|
||||
Copyright (c) 2022 kacperks, Looki2000, KacpereK, MCL and Lubek
|
||||
All other source code files are under the following license:
|
||||
Copyright (c) 2022 kacperks, Looki2000, KacpereK, Jakub W., MCL
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
|
||||
|
||||
All other media files (that is, sounds, images, schematics, and all other binary files) have been made available under the following license agreement:
|
||||
|
||||
|
||||
|
||||
Creative Commons Attribution 4.0 International Public License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
|
||||
|
||||
Section 1 – Definitions.
|
||||
|
||||
Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
|
||||
Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
|
||||
Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
|
||||
Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
|
||||
Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
|
||||
Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
|
||||
Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
|
||||
Licensor means the individual(s) or entity(ies) granting rights under this Public License.
|
||||
Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
|
||||
Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
|
||||
You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
|
||||
|
||||
Section 2 – Scope.
|
||||
|
||||
License grant.
|
||||
Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
|
||||
reproduce and Share the Licensed Material, in whole or in part; and
|
||||
produce, reproduce, and Share Adapted Material.
|
||||
Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
|
||||
Term. The term of this Public License is specified in Section 6(a).
|
||||
Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
|
||||
Downstream recipients.
|
||||
Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
|
||||
No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
|
||||
No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
|
||||
|
||||
Other rights.
|
||||
Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
|
||||
Patent and trademark rights are not licensed under this Public License.
|
||||
To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.
|
||||
|
||||
Section 3 – License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the following conditions.
|
||||
|
||||
Attribution.
|
||||
|
||||
If You Share the Licensed Material (including in modified form), You must:
|
||||
retain the following if it is supplied by the Licensor with the Licensed Material:
|
||||
identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
|
||||
a copyright notice;
|
||||
a notice that refers to this Public License;
|
||||
a notice that refers to the disclaimer of warranties;
|
||||
a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
|
||||
indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
|
||||
indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
|
||||
You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
|
||||
If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
|
||||
If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License.
|
||||
|
||||
Section 4 – Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
|
||||
|
||||
for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;
|
||||
if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and
|
||||
You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
|
||||
|
||||
For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
|
||||
|
||||
Section 5 – Disclaimer of Warranties and Limitation of Liability.
|
||||
|
||||
Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.
|
||||
To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.
|
||||
|
||||
The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
|
||||
|
||||
Section 6 – Term and Termination.
|
||||
|
||||
This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
|
||||
|
||||
Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
|
||||
automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
|
||||
upon express reinstatement by the Licensor.
|
||||
For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
|
||||
For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
|
||||
Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
|
||||
|
||||
Section 7 – Other Terms and Conditions.
|
||||
|
||||
The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
|
||||
Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
|
||||
|
||||
Section 8 – Interpretation.
|
||||
|
||||
For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
|
||||
To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
|
||||
No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
|
||||
Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
|
||||
* Dumb MineTest game made for the MineTest Game Jam 2022 made in less than 1 day on the last day of the jam
|
||||
|
||||
* Made by : kacperks, Looki2000, and Kacperek; with the help of Migdyn from MCL Software (XtreemSoft Ltd)
|
||||
* Made by : kacperks, Looki2000, and Kacperek; with the help of Migdyn from MCL Software
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
title = Shitting Simulator
|
||||
description = A game where you shit on the floor and put your feces in boxes.
|
||||
allowed_mapgens = singlenode
|
||||
disabled_settings = enable_damage
|
||||
disabled_settings = !enable_damage, creative_mode, enable_server
|
||||
author = kacperks, Looki2000, Kacperek, and MCL
|
||||
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 1.7 KiB |
27
mods/player_api/README.txt
Normal file
@@ -0,0 +1,27 @@
|
||||
Minetest Game mod: player_api
|
||||
=============================
|
||||
See license.txt for license information.
|
||||
|
||||
Provides an API to allow multiple mods to set player models and textures.
|
||||
Also sets the default model, texture, and player flags.
|
||||
This mod is only for content related to the Player API and the player object.
|
||||
|
||||
Authors of source code
|
||||
----------------------
|
||||
Originally by celeron55, Perttu Ahola <celeron55@gmail.com> (LGPLv2.1+)
|
||||
Various Minetest developers and contributors (LGPLv2.1+)
|
||||
|
||||
Authors of media (textures, models and sounds)
|
||||
----------------------------------------------
|
||||
Original model by MirceaKitsune (CC BY-SA 3.0).
|
||||
Various alterations and fixes by kilbith, sofar, xunto, Rogier-5, TeTpaAka, Desour,
|
||||
stujones11, An0n3m0us (CC BY-SA 3.0):
|
||||
character.b3d
|
||||
character.blend
|
||||
|
||||
Jordach (CC BY-SA 3.0):
|
||||
character.png
|
||||
|
||||
celeron55, Perttu Ahola <celeron55@gmail.com> (CC BY-SA 3.0):
|
||||
player.png
|
||||
player_back.png
|
||||
228
mods/player_api/api.lua
Normal file
@@ -0,0 +1,228 @@
|
||||
player_api = {}
|
||||
|
||||
-- Player animation blending
|
||||
-- Note: This is currently broken due to a bug in Irrlicht, leave at 0
|
||||
local animation_blend = 0
|
||||
|
||||
player_api.registered_models = {}
|
||||
|
||||
-- Local for speed.
|
||||
local models = player_api.registered_models
|
||||
|
||||
local function collisionbox_equals(collisionbox, other_collisionbox)
|
||||
if collisionbox == other_collisionbox then
|
||||
return true
|
||||
end
|
||||
for index = 1, 6 do
|
||||
if collisionbox[index] ~= other_collisionbox[index] then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function player_api.register_model(name, def)
|
||||
models[name] = def
|
||||
def.visual_size = def.visual_size or {x = 1, y = 1}
|
||||
def.collisionbox = def.collisionbox or {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}
|
||||
def.stepheight = def.stepheight or 0.6
|
||||
def.eye_height = def.eye_height or 1.47
|
||||
|
||||
-- Sort animations into property classes:
|
||||
-- Animations with same properties have the same _equals value
|
||||
for animation_name, animation in pairs(def.animations) do
|
||||
animation.eye_height = animation.eye_height or def.eye_height
|
||||
animation.collisionbox = animation.collisionbox or def.collisionbox
|
||||
animation.override_local = animation.override_local or false
|
||||
|
||||
for _, other_animation in pairs(def.animations) do
|
||||
if other_animation._equals then
|
||||
if collisionbox_equals(animation.collisionbox, other_animation.collisionbox)
|
||||
and animation.eye_height == other_animation.eye_height then
|
||||
animation._equals = other_animation._equals
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
animation._equals = animation._equals or animation_name
|
||||
end
|
||||
end
|
||||
|
||||
-- Player stats and animations
|
||||
-- model, textures, animation
|
||||
local players = {}
|
||||
player_api.player_attached = {}
|
||||
|
||||
local function get_player_data(player)
|
||||
return assert(players[player:get_player_name()])
|
||||
end
|
||||
|
||||
function player_api.get_animation(player)
|
||||
return get_player_data(player)
|
||||
end
|
||||
|
||||
-- Called when a player's appearance needs to be updated
|
||||
function player_api.set_model(player, model_name)
|
||||
local player_data = get_player_data(player)
|
||||
if player_data.model == model_name then
|
||||
return
|
||||
end
|
||||
player_data.model = model_name
|
||||
|
||||
local model = models[model_name]
|
||||
if model then
|
||||
player:set_properties({
|
||||
mesh = model_name,
|
||||
textures = player_data.textures or model.textures,
|
||||
visual = "mesh",
|
||||
visual_size = model.visual_size,
|
||||
stepheight = model.stepheight
|
||||
})
|
||||
-- sets local_animation, collisionbox & eye_height
|
||||
player_api.set_animation(player, "stand")
|
||||
else
|
||||
player:set_properties({
|
||||
textures = {"player.png", "player_back.png"},
|
||||
visual = "upright_sprite",
|
||||
visual_size = {x = 1, y = 2},
|
||||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.75, 0.3},
|
||||
stepheight = 0.6,
|
||||
eye_height = 1.625,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
function player_api.get_textures(player)
|
||||
local player_data = get_player_data(player)
|
||||
local model = models[player_data.model]
|
||||
return assert(player_data.textures or (model and model.textures))
|
||||
end
|
||||
|
||||
function player_api.set_textures(player, textures)
|
||||
local player_data = get_player_data(player)
|
||||
local model = models[player_data.model]
|
||||
local new_textures = assert(textures or (model and model.textures))
|
||||
player_data.textures = new_textures
|
||||
player:set_properties({textures = new_textures})
|
||||
end
|
||||
|
||||
function player_api.set_texture(player, index, texture)
|
||||
local textures = table.copy(player_api.get_textures(player))
|
||||
textures[index] = texture
|
||||
player_api.set_textures(player, textures)
|
||||
end
|
||||
|
||||
function player_api.set_animation(player, anim_name, speed)
|
||||
local player_data = get_player_data(player)
|
||||
local model = models[player_data.model]
|
||||
if not (model and model.animations[anim_name]) then
|
||||
return
|
||||
end
|
||||
speed = speed or model.animation_speed
|
||||
if player_data.animation == anim_name and player_data.animation_speed == speed then
|
||||
return
|
||||
end
|
||||
local previous_anim = model.animations[player_data.animation] or {}
|
||||
local anim = model.animations[anim_name]
|
||||
player_data.animation = anim_name
|
||||
player_data.animation_speed = speed
|
||||
-- If necessary change the local animation (only seen by the client of *that* player)
|
||||
-- `override_local` <=> suspend local animations while this one is active
|
||||
-- (this is basically a hack, proper engine feature needed...)
|
||||
if anim.override_local ~= previous_anim.override_local then
|
||||
if anim.override_local then
|
||||
local none = {x=0, y=0}
|
||||
player:set_local_animation(none, none, none, none, 1)
|
||||
else
|
||||
local a = model.animations -- (not specific to the animation being set)
|
||||
player:set_local_animation(
|
||||
a.stand, a.walk, a.mine, a.walk_mine,
|
||||
model.animation_speed or 30
|
||||
)
|
||||
end
|
||||
end
|
||||
-- Set the animation seen by everyone else
|
||||
player:set_animation(anim, speed, animation_blend)
|
||||
-- Update related properties if they changed
|
||||
if anim._equals ~= previous_anim._equals then
|
||||
player:set_properties({
|
||||
collisionbox = anim.collisionbox,
|
||||
eye_height = anim.eye_height
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
players[name] = {}
|
||||
player_api.player_attached[name] = false
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
players[name] = nil
|
||||
player_api.player_attached[name] = nil
|
||||
end)
|
||||
|
||||
-- Localize for better performance.
|
||||
local player_set_animation = player_api.set_animation
|
||||
local player_attached = player_api.player_attached
|
||||
|
||||
-- Prevent knockback for attached players
|
||||
local old_calculate_knockback = minetest.calculate_knockback
|
||||
function minetest.calculate_knockback(player, ...)
|
||||
if player_attached[player:get_player_name()] then
|
||||
return 0
|
||||
end
|
||||
return old_calculate_knockback(player, ...)
|
||||
end
|
||||
|
||||
-- Check each player and apply animations
|
||||
function player_api.globalstep()
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local name = player:get_player_name()
|
||||
local player_data = players[name]
|
||||
local model = player_data and models[player_data.model]
|
||||
if model and not player_attached[name] then
|
||||
local controls = player:get_player_control()
|
||||
local animation_speed_mod = model.animation_speed or 30
|
||||
|
||||
-- Determine if the player is sneaking, and reduce animation speed if so
|
||||
if controls.sneak then
|
||||
animation_speed_mod = animation_speed_mod / 2
|
||||
end
|
||||
|
||||
-- Apply animations based on what the player is doing
|
||||
if player:get_hp() == 0 then
|
||||
player_set_animation(player, "lay")
|
||||
elseif controls.up or controls.down or controls.left or controls.right then
|
||||
if controls.LMB or controls.RMB then
|
||||
player_set_animation(player, "walk_mine", animation_speed_mod)
|
||||
else
|
||||
player_set_animation(player, "walk", animation_speed_mod)
|
||||
end
|
||||
elseif controls.LMB or controls.RMB then
|
||||
player_set_animation(player, "mine", animation_speed_mod)
|
||||
else
|
||||
player_set_animation(player, "stand", animation_speed_mod)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Mods can modify the globalstep by overriding player_api.globalstep
|
||||
minetest.register_globalstep(function(...)
|
||||
player_api.globalstep(...)
|
||||
end)
|
||||
|
||||
for _, api_function in pairs({"get_animation", "set_animation", "set_model", "set_textures"}) do
|
||||
local original_function = player_api[api_function]
|
||||
player_api[api_function] = function(player, ...)
|
||||
if not players[player:get_player_name()] then
|
||||
-- HACK for keeping backwards compatibility
|
||||
minetest.log("warning", api_function .. " called on offline player")
|
||||
return
|
||||
end
|
||||
return original_function(player, ...)
|
||||
end
|
||||
end
|
||||
26
mods/player_api/init.lua
Normal file
@@ -0,0 +1,26 @@
|
||||
dofile(minetest.get_modpath("player_api") .. "/api.lua")
|
||||
|
||||
-- Default player appearance
|
||||
player_api.register_model("character.b3d", {
|
||||
animation_speed = 30,
|
||||
textures = {"character.png"},
|
||||
animations = {
|
||||
-- Standard animations.
|
||||
stand = {x = 0, y = 79},
|
||||
lay = {x = 162, y = 166, eye_height = 0.3, override_local = true,
|
||||
collisionbox = {-0.6, 0.0, -0.6, 0.6, 0.3, 0.6}},
|
||||
walk = {x = 168, y = 187},
|
||||
mine = {x = 189, y = 198},
|
||||
walk_mine = {x = 200, y = 219},
|
||||
sit = {x = 81, y = 160, eye_height = 0.8, override_local = true,
|
||||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.0, 0.3}}
|
||||
},
|
||||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
||||
stepheight = 0.6,
|
||||
eye_height = 1.47,
|
||||
})
|
||||
|
||||
-- Update appearance when the player joins
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
player_api.set_model(player, "character.b3d")
|
||||
end)
|
||||
60
mods/player_api/license.txt
Normal file
@@ -0,0 +1,60 @@
|
||||
License of source code
|
||||
----------------------
|
||||
|
||||
GNU Lesser General Public License, version 2.1
|
||||
Copyright (C) 2011 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
Copyright (C) 2011 Various Minetest developers and contributors
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under the terms
|
||||
of the GNU Lesser General Public License as published by the Free Software Foundation;
|
||||
either version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details:
|
||||
https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
|
||||
|
||||
|
||||
Licenses of media (textures, models and sounds)
|
||||
-----------------------------------------------
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||||
Copyright (C) 2011 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
Copyright (C) 2012 MirceaKitsune
|
||||
Copyright (C) 2012 Jordach
|
||||
Copyright (C) 2015 kilbith
|
||||
Copyright (C) 2016 sofar
|
||||
Copyright (C) 2016 xunto
|
||||
Copyright (C) 2016 Rogier-5
|
||||
Copyright (C) 2017 TeTpaAka
|
||||
Copyright (C) 2017 Desour
|
||||
Copyright (C) 2018 stujones11
|
||||
Copyright (C) 2019 An0n3m0us
|
||||
|
||||
You are free to:
|
||||
Share — copy and redistribute the material in any medium or format.
|
||||
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
|
||||
The licensor cannot revoke these freedoms as long as you follow the license terms.
|
||||
|
||||
Under the following terms:
|
||||
|
||||
Attribution — You must give appropriate credit, provide a link to the license, and
|
||||
indicate if changes were made. You may do so in any reasonable manner, but not in any way
|
||||
that suggests the licensor endorses you or your use.
|
||||
|
||||
ShareAlike — If you remix, transform, or build upon the material, you must distribute
|
||||
your contributions under the same license as the original.
|
||||
|
||||
No additional restrictions — You may not apply legal terms or technological measures that
|
||||
legally restrict others from doing anything the license permits.
|
||||
|
||||
Notices:
|
||||
|
||||
You do not have to comply with the license for elements of the material in the public
|
||||
domain or where your use is permitted by an applicable exception or limitation.
|
||||
No warranties are given. The license may not give you all of the permissions necessary
|
||||
for your intended use. For example, other rights such as publicity, privacy, or moral
|
||||
rights may limit how you use the material.
|
||||
|
||||
For more details:
|
||||
http://creativecommons.org/licenses/by-sa/3.0/
|
||||
2
mods/player_api/mod.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
name = player_api
|
||||
description = Minetest Game mod: Manages player visuals
|
||||
BIN
mods/player_api/models/character.b3d
Normal file
BIN
mods/player_api/models/character.blend
Normal file
BIN
mods/player_api/models/character.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
mods/player_api/textures/player.png
Normal file
|
After Width: | Height: | Size: 142 B |
BIN
mods/player_api/textures/player_back.png
Normal file
|
After Width: | Height: | Size: 140 B |
41
mods/pn/.gitignore
vendored
@@ -1,41 +0,0 @@
|
||||
# Compiled Lua sources
|
||||
luac.out
|
||||
|
||||
# luarocks build files
|
||||
*.src.rock
|
||||
*.zip
|
||||
*.tar.gz
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.os
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
*.def
|
||||
*.exp
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Emojigit
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,9 +0,0 @@
|
||||
This mod add `setblock` and `place` command
|
||||
|
||||
## Commands
|
||||
|
||||
### /setblock x y z modname:foobar_node & /place x y z modname:foobar_node
|
||||
Place a block at x,y,z (setblock call `minetest.set_node`, and place call `minetest.place_node`)
|
||||
|
||||
### /setblock_heremodname:foobar_node & /place_here modname:foobar_node
|
||||
Place a block at your pos (setblock call `minetest.set_node`, and place call `minetest.place_node`)
|
||||
103
mods/pn/init.lua
@@ -1,103 +0,0 @@
|
||||
minetest.register_privilege("setblock", {
|
||||
description = "Player can use place and setblock command.",
|
||||
give_to_singleplayer= false,
|
||||
})
|
||||
|
||||
local function split (inputstr, sep)
|
||||
if sep == nil then
|
||||
sep = "%s"
|
||||
end
|
||||
local t={}
|
||||
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
|
||||
table.insert(t, str)
|
||||
end
|
||||
return t
|
||||
end
|
||||
|
||||
minetest.register_chatcommand("place", {
|
||||
params = "<x> <y> <x> <nodename>",
|
||||
description = "Place block",
|
||||
privs = {setblock = true},
|
||||
func = function(name, param)
|
||||
splited = split(param," ")
|
||||
if not(tonumber(splited[1]) and tonumber(splited[2]) and tonumber(splited[3])) then
|
||||
return false, "Pos error: please give int!"
|
||||
end
|
||||
x,y,z,node = tonumber(splited[1]),tonumber(splited[2]),tonumber(splited[3]),splited[4]
|
||||
if node == "ignore" then
|
||||
return false, "You can't place \"ignore\"!"
|
||||
end
|
||||
if minetest.registered_nodes[node] then
|
||||
minetest.place_node({x=x, y=y, z=z}, {name=node})
|
||||
return true, "Setted node "..node.." at "..tostring(x)..tostring(y)..tostring(z)
|
||||
else
|
||||
return false, "Cannot place a unknown node."
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("place_here", {
|
||||
params = "<node>",
|
||||
privs = {setblock = true},
|
||||
description = "Place block at player's pos",
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
if not player then
|
||||
return false, "Player is not online."
|
||||
end
|
||||
if param == "ignore" then
|
||||
return false, "You can't place \"ignore\"!"
|
||||
end
|
||||
if minetest.registered_nodes[param] then
|
||||
minetest.place_node(player:get_pos(), {name=param})
|
||||
return true, "Placed node "..param.." at "..tostring(math.floor(player:get_pos().x))..","..tostring(math.floor(player:get_pos().y))..","..tostring(math.floor(player:get_pos().z))
|
||||
else
|
||||
return false, "Cannot place a unknown node."
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- minetest.set_node
|
||||
|
||||
minetest.register_chatcommand("setblock", {
|
||||
params = "<x> <y> <x> <nodename>",
|
||||
privs = {setblock = true},
|
||||
description = "Set a block",
|
||||
func = function(name, param)
|
||||
splited = split(param," ")
|
||||
if not(tonumber(splited[1]) and tonumber(splited[2]) and tonumber(splited[3])) then
|
||||
return false, "Pos error: please give int!"
|
||||
end
|
||||
x,y,z,node = tonumber(splited[1]),tonumber(splited[2]),tonumber(splited[3]),splited[4]
|
||||
if node == "ignore" then
|
||||
return false, "You can't set \"ignore\"!"
|
||||
end
|
||||
if minetest.registered_nodes[node] then
|
||||
minetest.set_node({x=x, y=y, z=z}, {name=node})
|
||||
return true, "Setted node "..node.." at "..tostring(x)..tostring(y)..tostring(z)
|
||||
else
|
||||
return false, "Cannot set a unknown node."
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("setblock_here", {
|
||||
params = "<node>",
|
||||
privs = {setblock = true},
|
||||
description = "Set a block at player's pos",
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
if not player then
|
||||
return false, "Player is not online."
|
||||
end
|
||||
if param == "ignore" then
|
||||
return false, "You can't set \"ignore\"!"
|
||||
end
|
||||
if minetest.registered_nodes[param] then
|
||||
minetest.set_node(player:get_pos(), {name=param})
|
||||
return true, "Setted node "..param.." at "..tostring(math.floor(player:get_pos().x))..","..tostring(math.floor(player:get_pos().y))..","..tostring(math.floor(player:get_pos().z))
|
||||
else
|
||||
return false, "Cannot set a unknown node."
|
||||
end
|
||||
end,
|
||||
})
|
||||
@@ -1,2 +0,0 @@
|
||||
name = place_node
|
||||
description = Add `setblock` and `place` command to the game
|
||||
|
Before Width: | Height: | Size: 2.8 MiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 712 B |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 560 B |
@@ -2794,6 +2794,8 @@ local tr = minetest.get_modpath("toolranks")
|
||||
-- deal damage and effects when mob punched
|
||||
function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
|
||||
|
||||
|
||||
self.health = self.health - 3
|
||||
-- mob health check
|
||||
if self.health <= 0 then
|
||||
return true
|
||||
@@ -2898,8 +2900,8 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
|
||||
-- healing
|
||||
if damage <= -1 then
|
||||
|
||||
self.health = self.health - floor(damage)
|
||||
|
||||
self.health = self.health - 3
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
|
Before Width: | Height: | Size: 108 B After Width: | Height: | Size: 108 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 702 B After Width: | Height: | Size: 702 B |
|
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 235 B |
|
Before Width: | Height: | Size: 191 B After Width: | Height: | Size: 191 B |
|
Before Width: | Height: | Size: 196 B After Width: | Height: | Size: 196 B |
|
Before Width: | Height: | Size: 176 B After Width: | Height: | Size: 176 B |
|
Before Width: | Height: | Size: 411 B After Width: | Height: | Size: 411 B |
|
Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 253 B |
|
Before Width: | Height: | Size: 426 B After Width: | Height: | Size: 426 B |
|
Before Width: | Height: | Size: 271 B After Width: | Height: | Size: 271 B |
|
Before Width: | Height: | Size: 287 B After Width: | Height: | Size: 287 B |
|
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 247 B |
|
Before Width: | Height: | Size: 195 B After Width: | Height: | Size: 195 B |
|
Before Width: | Height: | Size: 165 B After Width: | Height: | Size: 165 B |
|
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 117 B |
|
Before Width: | Height: | Size: 164 B After Width: | Height: | Size: 164 B |
|
Before Width: | Height: | Size: 164 B After Width: | Height: | Size: 164 B |
|
Before Width: | Height: | Size: 166 B After Width: | Height: | Size: 166 B |
|
Before Width: | Height: | Size: 224 B After Width: | Height: | Size: 224 B |
|
Before Width: | Height: | Size: 202 B After Width: | Height: | Size: 202 B |
@@ -1,3 +1,7 @@
|
||||
x_p = 15
|
||||
y_p = 27
|
||||
z_p = 15
|
||||
|
||||
currentPage = 1
|
||||
|
||||
function game_over()
|
||||
@@ -16,6 +20,7 @@ function you_win(player)
|
||||
"position[0.5, 0.5]",
|
||||
"style_type[button;bgcolor=yellow;textcolor=green]",
|
||||
"hypertext[1, 12.5; 12, 5;;<global halign=center color=black size=20 font=Regular>" .. thanks .. "]\n",
|
||||
"image[1, .2; 16, 12; thanks.png]",
|
||||
"button[13, 14.9; 4, 1;exit;Quit]"
|
||||
}
|
||||
minetest.show_formspec(player:get_player_name(), "poop:story", table.concat(storyFormspec, ""))
|
||||
@@ -24,58 +29,50 @@ end
|
||||
minetest.register_item(":", { -- Hand
|
||||
type = "none",
|
||||
wield_image = "Poop.png",
|
||||
wield_scale = {x=1.5,y=2,z=4.5},
|
||||
wield_scale = {x=.3,y=2,z=2.5},
|
||||
range = 5,
|
||||
tool_capabilities = {
|
||||
max_drop_level = 0,
|
||||
full_punch_interval = 0.4,
|
||||
|
||||
groupcaps =
|
||||
{
|
||||
oddly_breakable_by_hand = {times={[1]=3.50,[2]=2.00,[3]=0.70}, uses=0},
|
||||
snappy = {times={[3]=0, [2]=0, [1]=0}, uses=0, maxlevel=3},
|
||||
crumbly = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3},
|
||||
cracky = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3},
|
||||
choppy = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3},
|
||||
},
|
||||
damage_groups = {fleshy = 3, snappy = 2},
|
||||
|
||||
damage_groups = {fleshy = 8, snappy = 8, cracky = 8},
|
||||
}
|
||||
})
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if formname ~= "story:story_formspec" then
|
||||
if formname ~= "poop:cutscene" then
|
||||
return
|
||||
end
|
||||
|
||||
if formname == "story:story_formspec" then
|
||||
if formname == "poop:cutscene" then
|
||||
if fields.next then
|
||||
if currentPage >= 4 then
|
||||
minetest.close_formspec(player:get_player_name(), "story:story_formspec")
|
||||
minetest.close_formspec(player:get_player_name(), "poop:cutscene")
|
||||
-- teleport player to 10 9.5 18
|
||||
player:setpos({x=10, y=9.5, z=18})
|
||||
player:set_pos({x = 32, y = 13, z = 34})
|
||||
return
|
||||
end
|
||||
currentPage = currentPage + 1 -- Fuck Lua and its lack of arithmetic assignment operators
|
||||
minetest.show_formspec(player:get_player_name(), "story:story_formspec", table.concat(getStoryFormspec(currentPage), "\n"))
|
||||
currentPage = currentPage + 1
|
||||
minetest.show_formspec(player:get_player_name(), "poop:cutscene", table.concat(getStoryFormspec(currentPage), "\n"))
|
||||
|
||||
elseif fields.back and currentPage >= 0 then
|
||||
currentPage = currentPage - 1 -- Fuck Lua and its lack of arithmetic assignment operators
|
||||
minetest.show_formspec(player:get_player_name(), "story:story_formspec", table.concat(getStoryFormspec(currentPage), "\n"))
|
||||
currentPage = currentPage - 1
|
||||
minetest.show_formspec(player:get_player_name(), "poop:cutscene", table.concat(getStoryFormspec(currentPage), "\n"))
|
||||
|
||||
elseif fields.exit then
|
||||
--minetest.kick_player(player:get_player_name(), "Fuck you in particular")
|
||||
minetest.request_shutdown("The game has crashed due to the citizen's neglience.\n This incident will be reported.")
|
||||
|
||||
minetest.kick_player(player:get_player_name(), "")
|
||||
|
||||
elseif fields.quit then
|
||||
minetest.after(0.2, function() minetest.show_formspec(player:get_player_name(), "story:story_formspec", table.concat(getStoryFormspec(currentPage), "\n")) end)
|
||||
minetest.after(0.2, function() minetest.show_formspec(player:get_player_name(), "poop:cutscene", table.concat(getStoryFormspec(currentPage), "\n")) end)
|
||||
end
|
||||
end
|
||||
end)
|
||||
storyText = {}
|
||||
|
||||
storyText[0] = "Click next to continue. Do NOT close the formspec by pressing the Escape key, or the game may break. To my knowledge, this is impossible to solve with the current Lua API."
|
||||
storyText[1] = "Welcome to the state-of-the-art Shitting Simulator! A very advanced, educational, and culturally significant Minetest Game!"
|
||||
storyText[2] = "So the story is simple: You've eaten so many pickles and beans and drank so much milk that your rectum will burst if you don't take a shit in the next two minutes."
|
||||
storyText[3] = "You accidently use your flux capacitor and travel in time to the far future, where you find yourself in a city where you are shitting all over the place."
|
||||
storyText[4] = "You have to run from the robocops and pack 100 pieces of shit into boxes! Good luck!"
|
||||
storyText[4] = "You have to run from the robocops and pack 200 pieces of shit into boxes! Good luck!"
|
||||
|
||||
function getStoryFormspec(number)
|
||||
storyFormspec =
|
||||
@@ -97,17 +94,30 @@ end
|
||||
is_game_started = false
|
||||
is_game_finished = false
|
||||
|
||||
minetest.register_on_respawnplayer(function(ObjectRef)
|
||||
minetest.after(1, function() ObjectRef:set_pos({x = 42, y = 13, z = 46})end)
|
||||
|
||||
end)
|
||||
|
||||
minetest.register_on_newplayer(function(ObjectRef)
|
||||
minetest.place_schematic({x = 0, y = 0, z = 0}, minetest.get_modpath("poop") .. "/map.mts", "0", nil, true)
|
||||
ObjectRef:set_pos({x = 15, y = 11, z = 15})
|
||||
minetest.set_node({x = 32, y = 12, z = 34}, {name = "poop:floor"})
|
||||
ObjectRef:set_pos({x = 32, y = 15, z = 34})
|
||||
minetest.after(1, function()
|
||||
minetest.place_schematic({x = 0, y = 0, z = 0}, minetest.get_modpath("poop") .. "/map.mts", "0", nil, true)
|
||||
minetest.fix_light({x = 0, y = 0, z = 0}, {x = 100, y = 100, z = 100}) end)
|
||||
|
||||
|
||||
|
||||
end)
|
||||
|
||||
|
||||
function ending()
|
||||
|
||||
end
|
||||
function begining()
|
||||
|
||||
function beginning()
|
||||
minetest.place_schematic({x = 0, y = 0, z = 0}, minetest.get_modpath("poop") .. "/map.mts", "0", nil, true)
|
||||
|
||||
minetest.fix_light({x = 0, y = 0, z = 0}, {x = 100, y = 100, z = 100})
|
||||
end
|
||||
|
||||
destruction_counter = {}
|
||||
@@ -118,26 +128,6 @@ local idText
|
||||
local idMeter
|
||||
|
||||
|
||||
minetest.register_item(":", { -- Hand
|
||||
type = "none",
|
||||
wield_image = "Poop.png",
|
||||
wield_scale = {x=1.5,y=2,z=4.5},
|
||||
range = 5,
|
||||
tool_capabilities = {
|
||||
max_drop_level = 0,
|
||||
full_punch_interval = 0.4,
|
||||
|
||||
groupcaps =
|
||||
{
|
||||
oddly_breakable_by_hand = {times={[1]=3.50,[2]=2.00,[3]=0.70}, uses=0},
|
||||
snappy = {times={[3]=0, [2]=0, [1]=0}, uses=0, maxlevel=3},
|
||||
crumbly = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3},
|
||||
cracky = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3},
|
||||
choppy = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3},
|
||||
},
|
||||
damage_groups = {fleshy = 3, snappy = 2},
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
|
||||
@@ -167,7 +157,7 @@ minetest.register_on_joinplayer(function(player)
|
||||
hud_elem_type = "image",
|
||||
position = {x = 1, y = .5},
|
||||
offset = {x = -510, y = 23},
|
||||
text = "destruction_counter_meter_full.png",
|
||||
text = "P.png",
|
||||
scale = {x = 0, y = 4},
|
||||
alignment = {x = 1, y = 0},
|
||||
})
|
||||
@@ -285,7 +275,7 @@ minetest.register_node("poop:floor", {
|
||||
minetest.register_node("poop:Poop", {
|
||||
description = "Just Shit",
|
||||
tiles = {"Poop.png"},
|
||||
drop = 'poop:PoopItem', groups = {cracky=3, stone=1},
|
||||
drop = 'poop:PoopItem', groups = {falling_node = 1, cracky=3, stone=1},
|
||||
})
|
||||
|
||||
minetest.register_node("poop:tv", {
|
||||
@@ -352,10 +342,10 @@ minetest.register_node("poop:glass", {
|
||||
drop = 'poop:glass', groups = {cracky=3, stone=1},
|
||||
})
|
||||
minetest.register_node("poop:Poop2", {
|
||||
description = "Poop with more density",
|
||||
description = "Diarrhea",
|
||||
tiles = {"sraka.png"},
|
||||
|
||||
drop = 'poop:Poop', groups = {cracky=3, stone=1},
|
||||
drop = 'poop:Poop', groups = {falling_node = 1, cracky=3, stone=1},
|
||||
})
|
||||
|
||||
minetest.register_node("poop:glowing_block", {
|
||||
@@ -372,19 +362,37 @@ minetest.register_node("poop:flux_capacitor", {
|
||||
|
||||
drop = 'poop:Poop', groups = {cracky=3, stone=1},
|
||||
})
|
||||
|
||||
minetest.register_node("poop:transparent", {
|
||||
description = "Transparent",
|
||||
drawtype = "glasslike",
|
||||
tiles = {"transparent.png"},
|
||||
paramtype = "light",
|
||||
is_ground_content = false,
|
||||
sunlight_propagates = true,
|
||||
groups = {cracky=3,oddly_breakable_by_hand=3},
|
||||
})
|
||||
minetest.register_alias("mapgen_stone", "poop:floor")
|
||||
|
||||
local pooped_things = 0
|
||||
|
||||
local b = false
|
||||
minetest.register_craftitem("poop:plumba", {
|
||||
type = "tool",
|
||||
description = "Plumba",
|
||||
inventory_image = "plumba.png",
|
||||
tool_capabilities = {
|
||||
max_drop_level = 0,
|
||||
full_punch_interval = 0.4,
|
||||
|
||||
|
||||
damage_groups = {fleshy = 8, snappy = 8}
|
||||
},
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
-- check if pointing at a node
|
||||
if pointed_thing.type ~= "node" then
|
||||
return
|
||||
end
|
||||
if pooped_things >= 100 then
|
||||
if pooped_things >= 200 then
|
||||
is_game_finished = true
|
||||
you_win(user)
|
||||
return
|
||||
@@ -393,12 +401,15 @@ minetest.register_craftitem("poop:plumba", {
|
||||
local node = minetest.get_node(pointed_thing.under)
|
||||
-- check if node is poop
|
||||
if node.name == "poop:Poop" then
|
||||
pooped_things = pooped_things + 1
|
||||
destruction_counter.nodesDestroyed = pooped_things
|
||||
destruction_counter.updateCounter(user)
|
||||
minetest.remove_node(pointed_thing.under)
|
||||
minetest.add_node(pointed_thing.under, {name="poop:box"})
|
||||
minetest.chat_send_player(user:get_player_name(), "You packed "..pooped_things.." shits!")
|
||||
pooped_things = pooped_things + 1
|
||||
minetest.chat_send_player(user:get_player_name(), "You packed "..pooped_things.."/200 shits!")
|
||||
|
||||
if pooped_things == 100 then
|
||||
if pooped_things >= 100 then
|
||||
if(b == false)then
|
||||
-- stop first music loop
|
||||
minetest.sound_stop(first_music)
|
||||
-- play second music loop
|
||||
@@ -407,21 +418,22 @@ minetest.register_craftitem("poop:plumba", {
|
||||
pitch = 1,
|
||||
loop = true,
|
||||
})
|
||||
|
||||
b= true
|
||||
end
|
||||
end
|
||||
|
||||
destruction_counter.nodesDestroyed = pooped_things
|
||||
destruction_counter.updateCounter(user)
|
||||
|
||||
pakuj_guwno()
|
||||
return itemstack
|
||||
else if node.name == "poop:Poop2" then
|
||||
pooped_things = pooped_things + 1
|
||||
destruction_counter.nodesDestroyed = pooped_things
|
||||
destruction_counter.updateCounter(user)
|
||||
minetest.remove_node(pointed_thing.under)
|
||||
minetest.add_node(pointed_thing.under, {name="poop:box"})
|
||||
minetest.chat_send_player(user:get_player_name(), "You packed "..pooped_things.." shits!")
|
||||
pakuj_guwno()
|
||||
pooped_things = pooped_things + 1
|
||||
destruction_counter.nodesDestroyed = pooped_things
|
||||
destruction_counter.updateCounter(user)
|
||||
|
||||
return itemstack
|
||||
end
|
||||
|
||||
@@ -444,15 +456,19 @@ minetest.register_craftitem("poop:pooper", {
|
||||
local node = minetest.get_node(pointed_thing.above)
|
||||
if node.name == "air" then
|
||||
minetest.add_node(pointed_thing.above, {name="poop:Poop"})
|
||||
minetest.check_for_falling(pointed_thing.above)
|
||||
else
|
||||
minetest.add_node(pointed_thing.under, {name="poop:Poop"})
|
||||
minetest.check_for_falling(pointed_thing.under)
|
||||
end
|
||||
else
|
||||
local node = minetest.get_node(pointed_thing.above)
|
||||
if node.name == "air" then
|
||||
minetest.add_node(pointed_thing.above, {name="poop:Poop2"})
|
||||
minetest.check_for_falling(pointed_thing.above)
|
||||
else
|
||||
minetest.add_node(pointed_thing.under, {name="poop:Poop2"})
|
||||
minetest.check_for_falling(pointed_thing.under)
|
||||
end
|
||||
end
|
||||
sraj_dzwiek()
|
||||
@@ -461,9 +477,8 @@ minetest.register_craftitem("poop:pooper", {
|
||||
})
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
-- teleport to 0,0,0
|
||||
player:setpos({x=0, y=0, z=0})
|
||||
minetest.show_formspec(player:get_player_name(), "story:story_formspec", table.concat(getStoryFormspec(1), "\n"))
|
||||
|
||||
minetest.show_formspec(player:get_player_name(), "poop:cutscene", table.concat(getStoryFormspec(1), "\n"))
|
||||
player:get_inventory():set_list("main", {})
|
||||
-- set time to day
|
||||
minetest.set_timeofday(0.5)
|
||||
@@ -479,5 +494,4 @@ minetest.register_on_joinplayer(function(player)
|
||||
minetest.setting_set("time_speed", 0)
|
||||
minetest.set_timeofday(0)
|
||||
|
||||
begining()
|
||||
end)
|
||||
BIN
mods/shit_poop/map.mts
Normal file
1
mods/shit_poop/mod.conf
Normal file
@@ -0,0 +1 @@
|
||||
name = poop
|
||||
BIN
mods/shit_poop/textures/1.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |