diff --git a/client/src/main/java/nl/andrewl/aos2_client/render/GameRenderer.java b/client/src/main/java/nl/andrewl/aos2_client/render/GameRenderer.java index 60f7361..2535468 100644 --- a/client/src/main/java/nl/andrewl/aos2_client/render/GameRenderer.java +++ b/client/src/main/java/nl/andrewl/aos2_client/render/GameRenderer.java @@ -50,6 +50,7 @@ public class GameRenderer { private Model blockModel; private Model bulletModel; private Model smgModel; + private Model shotgunModel; private Model flagModel; // Standard GUI textures. @@ -149,6 +150,7 @@ public class GameRenderer { blockModel = new Model("model/block.obj", "model/block.png"); bulletModel = new Model("model/bullet.obj", "model/bullet.png"); flagModel = new Model("model/flag.obj", "model/flag.png"); + shotgunModel = new Model("model/shotgun.obj", "model/shotgun.png"); } catch (IOException e) { throw new RuntimeException(e); } @@ -231,6 +233,17 @@ public class GameRenderer { } } smgModel.unbind(); + shotgunModel.bind(); + if (myPlayer.getInventory().getSelectedItemStack().getType().getId() == ItemTypes.WINCHESTER.getId()) { + modelRenderer.render(shotgunModel, myPlayer.getHeldItemTransformData(), myPlayer.getHeldItemNormalTransformData()); + } + for (var player : client.getPlayers().values()) { + if (player.getHeldItemId() == ItemTypes.WINCHESTER.getId()) { + modelRenderer.render(shotgunModel, player.getHeldItemTransformData(), player.getHeldItemNormalTransformData()); + } + } + shotgunModel.unbind(); + blockModel.bind(); if (myPlayer.getInventory().getSelectedItemStack().getType().getId() == ItemTypes.BLOCK.getId()) { BlockItemStack stack = (BlockItemStack) myPlayer.getInventory().getSelectedItemStack(); diff --git a/client/src/main/resources/model/shotgun.mtl b/client/src/main/resources/model/shotgun.mtl new file mode 100644 index 0000000..c523985 --- /dev/null +++ b/client/src/main/resources/model/shotgun.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'shotgun.blend' +# Material Count: 1 + +newmtl Material +Ns 323.999994 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd shotgun.png diff --git a/client/src/main/resources/model/shotgun.obj b/client/src/main/resources/model/shotgun.obj new file mode 100644 index 0000000..d5f5efb --- /dev/null +++ b/client/src/main/resources/model/shotgun.obj @@ -0,0 +1,745 @@ +# Blender v2.82 (sub 7) OBJ File: 'shotgun.blend' +# www.blender.org +mtllib shotgun.mtl +o Cube +v 0.047990 0.047990 0.025924 +v 0.031359 -0.047990 0.025924 +v -0.047990 0.047990 0.025924 +v -0.031359 -0.047990 0.025924 +v -0.031359 -0.047990 0.103381 +v -0.047990 0.047990 0.103381 +v 0.031359 -0.047990 0.103381 +v 0.047990 0.047990 0.103381 +v 0.047990 0.010865 0.125727 +v 0.047990 0.047990 0.125727 +v -0.047990 0.010865 0.125727 +v 0.047990 0.043324 0.169151 +v -0.047990 0.047990 0.125727 +v 0.047990 0.015531 0.169151 +v -0.047990 0.015531 0.169151 +v -0.047990 0.043324 0.169151 +v 0.000000 0.035078 0.169151 +v 0.000000 0.023776 0.169151 +v -0.023995 0.047990 0.169151 +v 0.023995 0.047990 0.169151 +v -0.023995 0.010865 0.169151 +v 0.023995 0.010865 0.169151 +v -0.011997 0.037556 0.169151 +v 0.011997 0.021299 0.169151 +v 0.011997 0.037556 0.169151 +v -0.011997 0.021299 0.169151 +v 0.035992 0.049212 0.169151 +v -0.051755 0.029427 0.169151 +v -0.035992 0.009643 0.169151 +v 0.051755 0.029427 0.169151 +v -0.035992 0.049212 0.169151 +v 0.035992 0.009643 0.169151 +v 0.000000 0.047990 0.125727 +v 0.000000 0.010865 0.125727 +v 0.047990 0.043324 0.683394 +v 0.047990 0.015531 0.683394 +v -0.047990 0.015531 0.683394 +v -0.047990 0.043324 0.683394 +v 0.000000 0.035078 0.683394 +v 0.000000 0.023776 0.683394 +v -0.023995 0.047990 0.683394 +v 0.023995 0.047990 0.683394 +v -0.023995 0.010865 0.683394 +v 0.023995 0.010865 0.683394 +v -0.011997 0.037556 0.683394 +v 0.011997 0.021299 0.683394 +v 0.011997 0.037556 0.683394 +v -0.011997 0.021299 0.683394 +v 0.035992 0.049212 0.683394 +v -0.051755 0.029427 0.683394 +v -0.035992 0.009643 0.683394 +v 0.051755 0.029427 0.683394 +v -0.035992 0.049212 0.683394 +v 0.035992 0.009643 0.683394 +v 0.044983 0.039600 0.683394 +v 0.044983 0.019254 0.683394 +v -0.044983 0.019254 0.683394 +v -0.044983 0.039600 0.683394 +v 0.000000 0.033564 0.683394 +v 0.000000 0.025290 0.683394 +v -0.022491 0.043016 0.683394 +v 0.022491 0.043016 0.683394 +v -0.022491 0.015838 0.683394 +v 0.022491 0.015838 0.683394 +v -0.014163 0.035378 0.683394 +v 0.014163 0.023477 0.683394 +v 0.014163 0.035378 0.683394 +v -0.014163 0.023477 0.683394 +v 0.033737 0.043911 0.683394 +v -0.048512 0.029427 0.683394 +v -0.033737 0.014944 0.683394 +v 0.048512 0.029427 0.683394 +v -0.033737 0.043911 0.683394 +v 0.033737 0.014944 0.683394 +v 0.039222 0.037714 0.661614 +v 0.039222 0.021140 0.661614 +v -0.039222 0.021140 0.661614 +v -0.039222 0.037714 0.661614 +v -0.026699 0.040496 0.661614 +v 0.026699 0.040496 0.661614 +v -0.026699 0.018358 0.661614 +v 0.026699 0.018358 0.661614 +v -0.020637 0.034274 0.661614 +v 0.020637 0.024580 0.661614 +v 0.020637 0.034274 0.661614 +v -0.020637 0.024580 0.661614 +v 0.033634 0.041225 0.661614 +v -0.042299 0.029427 0.661614 +v -0.033634 0.017630 0.661614 +v 0.042299 0.029427 0.661614 +v -0.033634 0.041225 0.661614 +v 0.033634 0.017630 0.661614 +v 0.047990 0.047990 -0.095389 +v 0.031359 -0.047990 -0.095389 +v -0.047990 0.047990 -0.095389 +v -0.031359 -0.047990 -0.095389 +v 0.031473 0.047990 -0.199306 +v 0.020566 -0.047990 -0.199306 +v -0.031473 0.047990 -0.199306 +v -0.020566 -0.047990 -0.199306 +v 0.027149 0.020337 -0.310971 +v 0.017741 -0.075642 -0.281880 +v -0.027149 0.020337 -0.310971 +v -0.017741 -0.075642 -0.281880 +v 0.009415 -0.056704 0.052989 +v -0.009415 -0.056704 0.052989 +v -0.009415 -0.056704 0.076317 +v 0.009415 -0.056704 0.076317 +v 0.009415 -0.073796 0.052989 +v -0.009415 -0.073796 0.052989 +v -0.009415 -0.080898 0.076317 +v 0.009415 -0.080898 0.076317 +v 0.009415 -0.085659 0.049377 +v -0.009415 -0.085659 0.049377 +v -0.009415 -0.096685 0.061547 +v 0.009415 -0.096685 0.061547 +v 0.009415 -0.093383 0.040493 +v -0.009415 -0.093383 0.040493 +v -0.009415 -0.104409 0.045490 +v 0.009415 -0.104409 0.045490 +vt 0.018674 0.758089 +vt 0.181623 0.653031 +vt 0.032429 0.646382 +vt 0.190406 0.581707 +vt 0.876032 0.080583 +vt 0.727560 0.151954 +vt 0.876032 0.151954 +vt 0.239818 0.424942 +vt 0.380229 0.346969 +vt 0.231035 0.353618 +vt 0.921024 0.324824 +vt 0.984097 0.299695 +vt 0.887079 0.299695 +vt 0.801796 0.059993 +vt 0.727560 0.059993 +vt 0.727560 0.080583 +vt 0.299550 0.443027 +vt 0.389012 0.418293 +vt 0.100945 0.556973 +vt 0.041212 0.575058 +vt 0.725050 0.532305 +vt 0.725050 0.576616 +vt 0.817741 0.561260 +vt 0.312772 0.958716 +vt 0.275576 0.484305 +vt 0.254464 0.485191 +vt 0.714198 0.537771 +vt 0.695639 0.497833 +vt 0.714198 0.497482 +vt 0.297285 0.483326 +vt 0.076971 0.515695 +vt 0.055858 0.514809 +vt 0.043746 0.554481 +vt 0.584285 0.497833 +vt 0.565726 0.537771 +vt 0.565726 0.497482 +vt 0.156988 0.043150 +vt 0.098680 0.516674 +vt 0.459569 0.497966 +vt 0.478128 0.023177 +vt 0.478128 0.497926 +vt 0.602844 0.497760 +vt 0.403892 0.538227 +vt 0.403892 0.498061 +vt 0.422451 0.498158 +vt 0.552364 0.498061 +vt 0.552364 0.538227 +vt 0.533805 0.498158 +vt 0.441010 0.498138 +vt 0.515246 0.498138 +vt 0.478128 0.538227 +vt 0.764678 0.019982 +vt 0.496687 0.497966 +vt 0.677080 0.497760 +vt 0.916390 0.510438 +vt 0.981364 0.531871 +vt 0.981364 0.486067 +vt 0.639962 0.537771 +vt 0.621403 0.497138 +vt 0.658521 0.497138 +vt 0.639962 0.496990 +vt 0.496687 0.023218 +vt 0.639962 0.023158 +vt 0.422451 0.023410 +vt 0.714198 0.023649 +vt 0.658521 0.023305 +vt 0.552364 0.023313 +vt 0.441010 0.023390 +vt 0.584285 0.024001 +vt 0.333884 0.957829 +vt 0.515246 0.023390 +vt 0.677080 0.023928 +vt 0.533805 0.023410 +vt 0.602844 0.023928 +vt 0.135279 0.042171 +vt 0.459569 0.023218 +vt 0.695639 0.024001 +vt 0.621403 0.023305 +vt 0.944755 0.413332 +vt 0.938449 0.404336 +vt 0.946644 0.402254 +vt 0.944755 0.457643 +vt 0.938449 0.466638 +vt 0.937065 0.456254 +vt 0.931784 0.393953 +vt 0.937541 0.391176 +vt 0.554028 0.584753 +vt 0.543552 0.575372 +vt 0.549377 0.588187 +vt 0.903488 0.424409 +vt 0.895045 0.414720 +vt 0.906855 0.422410 +vt 0.554028 0.565991 +vt 0.549377 0.562558 +vt 0.885466 0.402254 +vt 0.900326 0.393953 +vt 0.893662 0.404336 +vt 0.928623 0.446565 +vt 0.925256 0.448565 +vt 0.909659 0.435487 +vt 0.907318 0.435487 +vt 0.946644 0.468720 +vt 0.931784 0.477022 +vt 0.885466 0.468720 +vt 0.900326 0.477022 +vt 0.894570 0.479798 +vt 0.714751 0.584278 +vt 0.704274 0.574897 +vt 0.710099 0.587712 +vt 0.903488 0.446565 +vt 0.906855 0.448565 +vt 0.922451 0.435487 +vt 0.924792 0.435487 +vt 0.928623 0.424409 +vt 0.925256 0.422410 +vt 0.887356 0.413332 +vt 0.887356 0.457643 +vt 0.893662 0.466638 +vt 0.895045 0.456254 +vt 0.714751 0.565516 +vt 0.710099 0.562082 +vt 0.937065 0.414720 +vt 0.541666 0.582393 +vt 0.525717 0.562308 +vt 0.526234 0.582362 +vt 0.510234 0.582393 +vt 0.965242 0.578802 +vt 0.978791 0.598924 +vt 0.968691 0.598956 +vt 0.598273 0.580288 +vt 0.632612 0.585107 +vt 0.598912 0.590667 +vt 0.473475 0.572722 +vt 0.507298 0.566303 +vt 0.507235 0.572707 +vt 0.436608 0.572723 +vt 0.470431 0.579141 +vt 0.436701 0.583106 +vt 0.507298 0.577866 +vt 0.473525 0.583106 +vt 0.996700 0.554921 +vt 0.981217 0.534836 +vt 0.980699 0.554890 +vt 0.560596 0.582973 +vt 0.595053 0.584931 +vt 0.561205 0.590668 +vt 0.996098 0.578794 +vt 0.977712 0.578754 +vt 0.965268 0.554921 +vt 0.560714 0.572589 +vt 0.595053 0.567770 +vt 0.594599 0.572926 +vt 0.996098 0.556782 +vt 0.982549 0.576904 +vt 0.983627 0.556734 +vt 0.470431 0.567578 +vt 0.470368 0.572738 +vt 0.967573 0.576936 +vt 0.965242 0.556774 +vt 0.594544 0.579330 +vt 0.632103 0.573547 +vt 0.632158 0.579951 +vt 0.598155 0.569904 +vt 0.632612 0.567946 +vt 0.398775 0.572253 +vt 0.404307 0.579708 +vt 0.423063 0.562540 +vt 0.673012 0.579237 +vt 0.667477 0.571778 +vt 0.691776 0.562072 +vt 0.008199 0.853983 +vt 0.167868 0.764738 +vt 0.984097 0.187699 +vt 0.727560 0.263734 +vt 0.366474 0.235262 +vt 0.038486 0.958716 +vt 0.156940 0.860561 +vt 0.967402 0.091762 +vt 0.887079 0.187699 +vt 0.753110 0.359485 +vt 0.876032 0.263734 +vt 0.206805 0.146017 +vt 0.217280 0.241911 +vt 0.909687 0.488031 +vt 0.840246 0.577470 +vt 0.895132 0.577470 +vt 0.963031 0.015985 +vt 0.903774 0.091762 +vt 0.759799 0.464024 +vt 0.850483 0.359485 +vt 0.355546 0.139439 +vt 0.237091 0.041284 +vt 0.979837 0.459515 +vt 0.950708 0.481825 +vt 0.979837 0.481825 +vt 0.921024 0.346361 +vt 0.887079 0.371203 +vt 0.950152 0.346361 +vt 0.984097 0.371203 +vt 0.950152 0.324824 +vt 0.635474 0.588741 +vt 0.664602 0.577901 +vt 0.635474 0.577901 +vt 0.664602 0.562127 +vt 0.635474 0.562127 +vt 0.963546 0.389475 +vt 0.989178 0.411336 +vt 0.997704 0.396419 +vt 0.953247 0.565166 +vt 0.927615 0.587027 +vt 0.961773 0.580082 +vt 0.984886 0.440283 +vt 0.988548 0.422763 +vt 0.965229 0.428763 +vt 0.951478 0.410588 +vt 0.929298 0.547739 +vt 0.915547 0.565913 +vt 0.979837 0.444260 +vt 0.950708 0.459515 +vt 0.981926 0.443352 +vt 0.999222 0.460739 +vt 0.999222 0.443352 +vt 0.952617 0.553738 +vt 0.948955 0.536218 +vt 0.746608 0.598773 +vt 0.721987 0.581386 +vt 0.721987 0.598773 +vt 0.981799 0.462303 +vt 0.996286 0.479690 +vt 0.996286 0.462303 +vt 0.876032 0.059993 +vt 0.242351 0.445519 +vt 0.817741 0.503350 +vt 0.725050 0.487994 +vt 0.403892 0.023313 +vt 0.565726 0.023649 +vt 0.355594 0.956850 +vt 0.114166 0.041284 +vt 0.548568 0.575372 +vt 0.894570 0.391176 +vt 0.937541 0.479798 +vt 0.709290 0.574897 +vt 0.538271 0.562336 +vt 0.512668 0.562336 +vt 0.473568 0.562339 +vt 0.994266 0.534863 +vt 0.993767 0.598956 +vt 0.968663 0.534863 +vt 0.561353 0.562210 +vt 0.992648 0.576936 +vt 0.436658 0.562339 +vt 0.598764 0.562210 +vt 0.416654 0.583193 +vt 0.433522 0.568939 +vt 0.426629 0.581908 +vt 0.433522 0.576955 +vt 0.409639 0.562342 +vt 0.401173 0.566333 +vt 0.669877 0.565856 +vt 0.678346 0.561868 +vt 0.702238 0.568479 +vt 0.702238 0.576497 +vt 0.685364 0.582730 +vt 0.695342 0.581449 +vt 0.190406 0.938488 +vt 0.825692 0.488031 +vt 0.908145 0.015985 +vt 0.843794 0.464024 +vt 0.389012 0.061512 +vt 0.664602 0.588741 +vt 0.997704 0.432149 +vt 0.950708 0.444260 +vt 0.981926 0.460739 +vt 0.961773 0.544353 +vt 0.746608 0.581386 +vt 0.981799 0.479690 +vn -0.9853 -0.1707 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.9853 -0.1707 0.0000 +vn 0.0000 -0.9519 -0.3065 +vn 0.9479 -0.1643 -0.2729 +vn -0.9479 -0.1643 -0.2729 +vn 0.0000 -0.3550 0.9349 +vn 0.9652 0.2615 0.0000 +vn -0.4385 -0.8936 0.0960 +vn 0.9648 -0.2614 0.0281 +vn -0.9648 0.2614 0.0281 +vn 0.4385 -0.8936 0.0960 +vn -0.9652 -0.2615 0.0000 +vn 0.2022 0.9793 0.0000 +vn -0.1012 -0.9933 -0.0559 +vn -0.4385 0.8936 0.0960 +vn 0.4385 0.8936 0.0960 +vn 0.1012 0.9933 -0.0559 +vn -0.1012 0.9933 -0.0559 +vn 0.6169 0.7094 0.3409 +vn -0.6169 0.7094 0.3409 +vn -0.1942 0.9403 0.2796 +vn 0.1942 0.9403 0.2796 +vn 0.1012 -0.9933 -0.0559 +vn 0.0000 -1.0000 0.0000 +vn -0.6169 -0.7094 0.3409 +vn 0.6169 -0.7094 0.3409 +vn 0.1942 -0.9403 0.2796 +vn -0.1942 -0.9403 0.2796 +vn -0.2022 0.9793 0.0000 +vn -0.2022 -0.9793 0.0000 +vn -0.4406 0.8977 0.0000 +vn -0.4406 -0.8977 0.0000 +vn 0.2022 -0.9793 0.0000 +vn 0.4406 0.8977 0.0000 +vn 0.1013 0.9949 0.0000 +vn 0.4406 -0.8977 0.0000 +vn 0.9652 -0.2615 0.0000 +vn -0.6562 0.7546 0.0000 +vn 0.6562 -0.7546 0.0000 +vn -0.1013 0.9949 0.0000 +vn -0.1013 -0.9949 0.0000 +vn -0.9652 0.2615 0.0000 +vn 0.6562 0.7546 0.0000 +vn 0.1013 -0.9949 0.0000 +vn -0.6562 -0.7546 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.9122 0.3165 0.2602 +vn 0.9122 -0.3165 0.2602 +vn -0.6996 0.6817 0.2140 +vn -0.3525 -0.9197 0.1729 +vn -0.1037 0.9872 0.1213 +vn 0.0786 0.9884 0.1296 +vn 0.3525 0.9197 0.1729 +vn -0.9122 -0.3165 0.2602 +vn -0.6575 -0.7169 0.2318 +vn -0.9586 0.0000 0.2849 +vn -0.9122 0.3165 0.2602 +vn 0.5290 -0.8419 0.1063 +vn 0.6575 0.7169 0.2318 +vn -0.5290 0.8419 0.1063 +vn 0.9586 0.0000 0.2849 +vn -0.0786 -0.9884 0.1296 +vn 0.1037 -0.9872 0.1213 +vn 0.6996 -0.6817 0.2140 +vn -0.9735 -0.1687 -0.1547 +vn -0.9935 -0.1129 -0.0105 +vn 0.9735 -0.1687 -0.1547 +vn 0.0000 -0.2901 -0.9570 +vn 0.0000 -0.9482 0.3176 +vn 0.0000 0.9707 -0.2404 +vn 0.9935 -0.1129 -0.0105 +vn 0.3691 -0.9294 0.0000 +vn 0.0000 -0.9519 0.3065 +vn -0.3691 -0.9294 0.0000 +vn 0.0000 0.2912 -0.9567 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.6832 0.7302 +vn 0.0000 -0.4128 -0.9108 +vn 0.0000 -0.9012 0.4335 +vn 0.0000 0.7547 -0.6561 +vn 0.9963 0.0000 -0.0864 +vn 0.9648 0.2614 0.0281 +vn -0.9963 0.0000 -0.0864 +vn -0.9648 -0.2614 0.0281 +vn 0.9032 0.3354 0.2679 +vn 0.9032 -0.3354 0.2679 +vn -0.6575 0.7169 0.2318 +vn -0.5290 -0.8419 0.1063 +vn -0.0786 0.9884 0.1296 +vn 0.1037 0.9872 0.1213 +vn 0.5290 0.8419 0.1063 +vn -0.9032 -0.3354 0.2679 +vn -0.6996 -0.6817 0.2140 +vn -0.9032 0.3354 0.2679 +vn 0.3525 -0.9197 0.1729 +vn 0.6996 0.6817 0.2140 +vn -0.3525 0.9197 0.1729 +vn -0.1037 -0.9872 0.1213 +vn 0.0786 -0.9884 0.1296 +vn 0.6575 -0.7169 0.2318 +vn -0.9884 -0.1123 -0.1026 +vn -0.9952 -0.0979 -0.0013 +vn 0.9884 -0.1123 -0.1026 +vn 0.9952 -0.0979 -0.0013 +usemtl Material +s off +f 95/1/1 4/2/1 3/3/1 +f 5/4/1 3/3/1 4/2/1 +f 6/5/2 1/6/2 3/7/2 +f 8/8/3 2/9/3 1/10/3 +f 105/11/4 4/12/4 2/13/4 +f 33/14/2 10/15/2 8/16/2 +f 8/8/5 9/17/5 7/18/5 +f 11/19/6 6/20/6 5/4/6 +f 34/21/7 11/22/7 5/23/7 +f 35/24/8 30/25/8 12/26/8 +f 11/27/9 29/28/9 15/29/9 +f 30/25/10 14/30/10 9/17/10 +f 28/31/11 16/32/11 13/33/11 +f 32/34/12 9/35/12 14/36/12 +f 37/37/13 28/31/13 15/38/13 +f 23/39/14 39/40/14 17/41/14 +f 32/34/15 22/42/15 9/35/15 +f 13/43/16 16/44/16 31/45/16 +f 12/46/17 10/47/17 27/48/17 +f 31/45/18 19/49/18 13/43/18 +f 27/48/19 10/47/19 20/50/19 +f 13/43/2 19/49/2 33/51/2 +f 23/39/20 33/51/20 19/49/20 +f 10/15/2 33/14/2 20/52/2 +f 20/50/21 33/51/21 25/53/21 +f 25/53/22 33/51/22 17/41/22 +f 17/41/23 33/51/23 23/39/23 +f 29/28/24 11/27/24 21/54/24 +f 11/55/25 34/56/25 21/57/25 +f 9/35/25 22/42/25 34/58/25 +f 22/42/26 24/59/26 34/58/26 +f 21/54/27 34/58/27 26/60/27 +f 26/60/28 34/58/28 18/61/28 +f 18/61/29 34/58/29 24/59/29 +f 17/41/30 47/62/30 25/53/30 +f 24/59/31 40/63/31 18/61/31 +f 16/44/32 53/64/32 31/45/32 +f 29/28/33 37/65/33 15/29/33 +f 18/61/34 48/66/34 26/60/34 +f 27/48/35 35/67/35 12/46/35 +f 31/45/36 41/68/36 19/49/36 +f 14/36/37 54/69/37 32/34/37 +f 52/70/38 14/30/38 30/25/38 +f 25/53/39 42/71/39 20/50/39 +f 26/60/40 43/72/40 21/54/40 +f 20/50/41 49/73/41 27/48/41 +f 32/34/42 44/74/42 22/42/42 +f 50/75/43 16/32/43 28/31/43 +f 19/49/44 45/76/44 23/39/44 +f 21/54/45 51/77/45 29/28/45 +f 22/42/46 46/78/46 24/59/46 +f 43/79/47 71/80/47 51/81/47 +f 44/82/47 74/83/47 64/84/47 +f 51/81/47 57/85/47 37/86/47 +f 55/87/47 52/88/47 35/89/47 +f 45/90/47 61/91/47 65/92/47 +f 52/88/47 56/93/47 36/94/47 +f 53/95/47 58/96/47 73/97/47 +f 46/98/47 64/84/47 66/99/47 +f 45/90/47 59/100/47 39/101/47 +f 54/102/47 56/103/47 74/83/47 +f 49/104/47 55/105/47 35/106/47 +f 57/107/47 50/108/47 37/109/47 +f 47/110/47 59/100/47 67/111/47 +f 46/98/47 60/112/47 40/113/47 +f 48/114/47 60/112/47 68/115/47 +f 41/116/47 73/97/47 61/91/47 +f 42/117/47 69/118/47 49/104/47 +f 47/110/47 62/119/47 42/117/47 +f 50/108/47 58/120/47 38/121/47 +f 48/114/47 63/122/47 43/79/47 +f 68/115/47 59/100/47 65/92/47 +f 67/111/47 60/112/47 66/99/47 +f 57/123/48 88/124/48 70/125/48 +f 88/124/49 58/126/49 70/125/49 +f 63/127/50 86/128/50 81/129/50 +f 69/130/51 75/131/51 55/132/51 +f 71/133/52 81/134/52 89/135/52 +f 74/136/53 82/137/53 64/138/53 +f 71/133/54 77/139/54 57/140/54 +f 55/141/55 90/142/55 72/143/55 +f 61/144/56 83/145/56 65/146/56 +f 65/147/57 86/128/57 68/148/57 +f 90/142/58 56/149/58 72/143/58 +f 73/150/59 78/151/59 91/152/59 +f 64/153/60 84/154/60 66/155/60 +f 74/136/61 76/156/61 92/157/61 +f 66/155/62 85/158/62 67/159/62 +f 73/150/63 79/160/63 61/144/63 +f 69/130/64 80/161/64 87/162/64 +f 62/163/65 85/164/65 80/161/65 +f 78/165/47 88/166/47 83/167/47 +f 90/168/47 75/169/47 85/170/47 +f 99/171/66 96/172/66 95/1/66 +f 96/173/25 2/13/25 4/12/25 +f 93/174/2 3/7/2 1/6/2 +f 94/175/3 1/10/3 2/9/3 +f 103/176/67 100/177/67 99/171/67 +f 100/178/25 94/179/25 96/173/25 +f 97/180/2 95/181/2 93/174/2 +f 94/175/68 97/182/68 93/183/68 +f 103/184/69 102/185/69 104/186/69 +f 104/187/70 98/188/70 100/178/70 +f 101/189/71 99/190/71 97/180/71 +f 98/191/72 101/192/72 97/182/72 +f 111/193/47 108/194/47 107/195/47 +f 108/196/73 2/13/73 7/197/73 +f 107/198/74 7/197/74 5/199/74 +f 106/200/75 5/199/75 4/12/75 +f 113/201/76 110/202/76 109/203/76 +f 109/203/77 106/204/77 105/205/77 +f 108/206/78 109/207/78 105/208/78 +f 110/209/79 107/210/79 106/211/79 +f 120/212/78 113/213/78 116/214/78 +f 116/214/78 109/207/78 112/215/78 +f 110/209/79 115/216/79 111/217/79 +f 115/218/80 112/219/80 111/193/80 +f 120/220/81 118/221/81 117/222/81 +f 114/223/79 119/224/79 115/216/79 +f 119/225/82 116/226/82 115/227/82 +f 117/228/83 114/229/83 113/230/83 +f 95/1/1 96/172/1 4/2/1 +f 5/4/1 6/20/1 3/3/1 +f 6/5/2 8/16/2 1/6/2 +f 8/8/3 7/18/3 2/9/3 +f 105/11/4 106/200/4 4/12/4 +f 8/16/2 6/5/2 33/14/2 +f 6/5/2 13/231/2 33/14/2 +f 8/8/78 10/232/78 9/17/78 +f 11/19/79 13/33/79 6/20/79 +f 5/23/7 7/233/7 34/21/7 +f 7/233/7 9/234/7 34/21/7 +f 35/24/8 52/70/8 30/25/8 +f 9/17/84 10/232/84 30/25/84 +f 10/232/85 12/26/85 30/25/85 +f 13/33/86 11/19/86 28/31/86 +f 11/19/87 15/38/87 28/31/87 +f 37/37/13 50/75/13 28/31/13 +f 23/39/14 45/76/14 39/40/14 +f 17/41/30 39/40/30 47/62/30 +f 24/59/31 46/78/31 40/63/31 +f 16/44/32 38/235/32 53/64/32 +f 29/28/33 51/77/33 37/65/33 +f 18/61/34 40/63/34 48/66/34 +f 27/48/35 49/73/35 35/67/35 +f 31/45/36 53/64/36 41/68/36 +f 14/36/37 36/236/37 54/69/37 +f 52/70/38 36/237/38 14/30/38 +f 25/53/39 47/62/39 42/71/39 +f 26/60/40 48/66/40 43/72/40 +f 20/50/41 42/71/41 49/73/41 +f 32/34/42 54/69/42 44/74/42 +f 50/75/43 38/238/43 16/32/43 +f 19/49/44 41/68/44 45/76/44 +f 21/54/45 43/72/45 51/77/45 +f 22/42/46 44/74/46 46/78/46 +f 43/79/47 63/122/47 71/80/47 +f 44/82/47 54/102/47 74/83/47 +f 51/81/47 71/80/47 57/85/47 +f 55/87/47 72/239/47 52/88/47 +f 45/90/47 41/116/47 61/91/47 +f 52/88/47 72/239/47 56/93/47 +f 53/95/47 38/240/47 58/96/47 +f 46/98/47 44/82/47 64/84/47 +f 45/90/47 65/92/47 59/100/47 +f 54/102/47 36/241/47 56/103/47 +f 49/104/47 69/118/47 55/105/47 +f 57/107/47 70/242/47 50/108/47 +f 47/110/47 39/101/47 59/100/47 +f 46/98/47 66/99/47 60/112/47 +f 48/114/47 40/113/47 60/112/47 +f 41/116/47 53/95/47 73/97/47 +f 42/117/47 62/119/47 69/118/47 +f 47/110/47 67/111/47 62/119/47 +f 50/108/47 70/242/47 58/120/47 +f 48/114/47 68/115/47 63/122/47 +f 68/115/47 60/112/47 59/100/47 +f 67/111/47 59/100/47 60/112/47 +f 57/123/88 77/243/88 88/124/88 +f 88/124/89 78/244/89 58/126/89 +f 63/127/90 68/148/90 86/128/90 +f 69/130/91 87/162/91 75/131/91 +f 71/133/92 63/245/92 81/134/92 +f 74/136/93 92/157/93 82/137/93 +f 71/133/94 89/135/94 77/139/94 +f 55/141/95 75/246/95 90/142/95 +f 61/144/96 79/160/96 83/145/96 +f 65/147/57 83/247/57 86/128/57 +f 90/142/97 76/248/97 56/149/97 +f 73/150/98 58/249/98 78/151/98 +f 64/153/99 82/250/99 84/154/99 +f 74/136/100 56/251/100 76/156/100 +f 66/155/62 84/154/62 85/158/62 +f 73/150/101 91/152/101 79/160/101 +f 69/130/102 62/163/102 80/161/102 +f 62/163/103 67/252/103 85/164/103 +f 88/166/47 77/253/47 86/254/47 +f 77/253/47 89/255/47 81/256/47 +f 86/254/47 77/253/47 81/256/47 +f 86/254/47 83/167/47 88/166/47 +f 83/167/47 79/257/47 78/165/47 +f 79/257/47 91/258/47 78/165/47 +f 75/169/47 87/259/47 80/260/47 +f 80/260/47 85/170/47 75/169/47 +f 85/170/47 84/261/47 90/168/47 +f 84/261/47 82/262/47 76/263/47 +f 82/262/47 92/264/47 76/263/47 +f 76/263/47 90/168/47 84/261/47 +f 99/171/104 100/177/104 96/172/104 +f 96/173/25 94/179/25 2/13/25 +f 93/174/2 95/181/2 3/7/2 +f 94/175/3 93/183/3 1/10/3 +f 103/176/105 104/265/105 100/177/105 +f 100/178/25 98/188/25 94/179/25 +f 97/180/2 99/190/2 95/181/2 +f 94/175/106 98/191/106 97/182/106 +f 103/184/69 101/266/69 102/185/69 +f 104/187/70 102/267/70 98/188/70 +f 101/189/71 103/268/71 99/190/71 +f 98/191/107 102/269/107 101/192/107 +f 111/193/47 112/219/47 108/194/47 +f 108/196/73 105/11/73 2/13/73 +f 107/198/74 108/196/74 7/197/74 +f 106/200/75 107/198/75 5/199/75 +f 113/201/76 114/270/76 110/202/76 +f 109/203/77 110/202/77 106/204/77 +f 108/206/78 112/215/78 109/207/78 +f 110/209/79 111/217/79 107/210/79 +f 120/212/78 117/271/78 113/213/78 +f 116/214/78 113/213/78 109/207/78 +f 110/209/79 114/223/79 115/216/79 +f 115/218/80 116/272/80 112/219/80 +f 120/220/81 119/273/81 118/221/81 +f 114/223/79 118/274/79 119/224/79 +f 119/225/82 120/275/82 116/226/82 +f 117/228/83 118/276/83 114/229/83 diff --git a/client/src/main/resources/model/shotgun.png b/client/src/main/resources/model/shotgun.png new file mode 100644 index 0000000..aafd430 Binary files /dev/null and b/client/src/main/resources/model/shotgun.png differ diff --git a/core/src/main/java/nl/andrewl/aos_core/model/item/gun/Ak47.java b/core/src/main/java/nl/andrewl/aos_core/model/item/gun/Ak47.java index 37c6517..0fdd2ed 100644 --- a/core/src/main/java/nl/andrewl/aos_core/model/item/gun/Ak47.java +++ b/core/src/main/java/nl/andrewl/aos_core/model/item/gun/Ak47.java @@ -13,7 +13,7 @@ public class Ak47 extends Gun { 0.95f, 0.1f, 1.2f, - 40f, + 0.4f, 30f, true ); diff --git a/core/src/main/java/nl/andrewl/aos_core/model/item/gun/Rifle.java b/core/src/main/java/nl/andrewl/aos_core/model/item/gun/Rifle.java index 1f07c6a..a5ed149 100644 --- a/core/src/main/java/nl/andrewl/aos_core/model/item/gun/Rifle.java +++ b/core/src/main/java/nl/andrewl/aos_core/model/item/gun/Rifle.java @@ -13,7 +13,7 @@ public class Rifle extends Gun { 0.97f, 0.8f, 2.5f, - 80f, + 0.8f, 50f, false ); diff --git a/core/src/main/java/nl/andrewl/aos_core/model/world/World.java b/core/src/main/java/nl/andrewl/aos_core/model/world/World.java index 80d97bf..08d08ca 100644 --- a/core/src/main/java/nl/andrewl/aos_core/model/world/World.java +++ b/core/src/main/java/nl/andrewl/aos_core/model/world/World.java @@ -118,6 +118,30 @@ public class World { return Collections.unmodifiableMap(spawnPoints); } + public int getMinX() { + return chunkMap.values().stream().mapToInt(c -> c.getPosition().x * Chunk.SIZE).min().orElse(0); + } + + public int getMinY() { + return chunkMap.values().stream().mapToInt(c -> c.getPosition().y * Chunk.SIZE).min().orElse(0); + } + + public int getMinZ() { + return chunkMap.values().stream().mapToInt(c -> c.getPosition().z * Chunk.SIZE).min().orElse(0); + } + + public int getMaxX() { + return chunkMap.values().stream().mapToInt(c -> c.getPosition().x * Chunk.SIZE + Chunk.SIZE - 1).max().orElse(0); + } + + public int getMaxY() { + return chunkMap.values().stream().mapToInt(c -> c.getPosition().y * Chunk.SIZE + Chunk.SIZE - 1).max().orElse(0); + } + + public int getMaxZ() { + return chunkMap.values().stream().mapToInt(c -> c.getPosition().z * Chunk.SIZE + Chunk.SIZE - 1).max().orElse(0); + } + /** * Clears all data from the world. */ diff --git a/design/models/shotgun.blend b/design/models/shotgun.blend new file mode 100644 index 0000000..16f2ae0 Binary files /dev/null and b/design/models/shotgun.blend differ diff --git a/design/models/shotgun.blend1 b/design/models/shotgun.blend1 new file mode 100644 index 0000000..5393c97 Binary files /dev/null and b/design/models/shotgun.blend1 differ diff --git a/server/src/main/java/nl/andrewl/aos2_server/PlayerManager.java b/server/src/main/java/nl/andrewl/aos2_server/PlayerManager.java index fd6541e..5dbe282 100644 --- a/server/src/main/java/nl/andrewl/aos2_server/PlayerManager.java +++ b/server/src/main/java/nl/andrewl/aos2_server/PlayerManager.java @@ -154,8 +154,9 @@ public class PlayerManager { * determined to be killed somehow. We will reset their inventory, health, * and respawn them. * @param player The player that died. + * @param killedBy The player that killed them. Can be null. */ - public void playerKilled(ServerPlayer player) { + public void playerKilled(ServerPlayer player, ServerPlayer killedBy) { Vector3f deathPosition = new Vector3f(player.getPosition()); player.setPosition(getBestSpawnPoint(player)); player.setVelocity(new Vector3f(0)); diff --git a/server/src/main/java/nl/andrewl/aos2_server/ProjectileManager.java b/server/src/main/java/nl/andrewl/aos2_server/ProjectileManager.java index 7c94f64..5c96a28 100644 --- a/server/src/main/java/nl/andrewl/aos2_server/ProjectileManager.java +++ b/server/src/main/java/nl/andrewl/aos2_server/ProjectileManager.java @@ -1,5 +1,6 @@ package nl.andrewl.aos2_server; +import nl.andrewl.aos2_server.model.BlockHitTracker; import nl.andrewl.aos2_server.model.ServerPlayer; import nl.andrewl.aos2_server.model.ServerProjectile; import nl.andrewl.aos_core.Directions; @@ -12,6 +13,7 @@ import nl.andrewl.aos_core.net.client.SoundMessage; import nl.andrewl.aos_core.net.world.ChunkUpdateMessage; import org.joml.Matrix4f; import org.joml.Vector3f; +import org.joml.Vector3i; import java.util.*; import java.util.concurrent.ThreadLocalRandom; @@ -27,11 +29,13 @@ public class ProjectileManager { private int nextProjectileId = 1; private final Map projectiles; private final Queue removalQueue; + private final Map blockHitTrackers; public ProjectileManager(Server server) { this.server = server; this.projectiles = new HashMap<>(); this.removalQueue = new LinkedList<>(); + this.blockHitTrackers = new HashMap<>(); } /** @@ -68,23 +72,25 @@ public class ProjectileManager { .mul(200 * MOVEMENT_FACTOR) .add(player.getVelocity()); - ServerProjectile bullet = new ServerProjectile(id, new Vector3f(pos), vel, Projectile.Type.BULLET, player); + ServerProjectile bullet = new ServerProjectile(id, new Vector3f(pos), vel, Projectile.Type.BULLET, player, gun); projectiles.put(bullet.getId(), bullet); server.getPlayerManager().broadcastUdpMessage(bullet.toMessage(false)); } } - public void tick(float dt) { + public void tick(long now, float dt) { for (var projectile : projectiles.values()) { - tickProjectile(projectile, dt); + tickProjectile(projectile, now, dt); } while (!removalQueue.isEmpty()) { ServerProjectile projectile = removalQueue.remove(); projectiles.remove(projectile.getId()); } + // Remove any block hit trackers for blocks whose cooldown period has passed. + blockHitTrackers.entrySet().removeIf(entry -> now - entry.getValue().getLastHitAt() > server.getConfig().actions.blockBulletDamageCooldown * 1000); } - private void tickProjectile(ServerProjectile projectile, float dt) { + private void tickProjectile(ServerProjectile projectile, long now, float dt) { projectile.getVelocity().y -= server.getConfig().physics.gravity * dt * MOVEMENT_FACTOR; // Check for if the bullet will move close enough to a player to hit them. @@ -139,7 +145,7 @@ public class ProjectileManager { // If we hit the world before the player, if (hit != null && (playerHit == null || worldHitDist < playerHitDist)) { // Bullet struck the world first. - handleProjectileBlockHit(hit, projectile); + handleProjectileBlockHit(hit, projectile, now); } else if (playerHit != null && (hit == null || playerHitDist < worldHitDist)) { // Bullet struck the player first. handleProjectilePlayerHit(playerHitType, hitPlayer, projectile); @@ -154,24 +160,37 @@ public class ProjectileManager { } } - private void handleProjectileBlockHit(Hit hit, ServerProjectile projectile) { - server.getWorld().setBlockAt(hit.pos().x, hit.pos().y, hit.pos().z, (byte) 0); - server.getPlayerManager().broadcastUdpMessage(ChunkUpdateMessage.fromWorld(hit.pos(), server.getWorld())); - int soundVariant = ThreadLocalRandom.current().nextInt(1, 6); - server.getPlayerManager().broadcastUdpMessage(new SoundMessage("bullet_impact_" + soundVariant, 1, hit.rawPos())); + private void handleProjectileBlockHit(Hit hit, ServerProjectile projectile, long now) { + if (!server.getTeamManager().isProtected(hit.pos())) { + Gun gun = (Gun) projectile.getSourceItem(); + float damage = gun.getBaseDamage(); + BlockHitTracker blockHitTracker = blockHitTrackers.computeIfAbsent(hit.pos(), p -> new BlockHitTracker(now, damage)); + if (blockHitTracker.getDamageAccumulated() >= server.getConfig().actions.blockBulletDamageResistance) { + server.getWorld().setBlockAt(hit.pos().x, hit.pos().y, hit.pos().z, (byte) 0); + server.getPlayerManager().broadcastUdpMessage(ChunkUpdateMessage.fromWorld(hit.pos(), server.getWorld())); + blockHitTrackers.remove(hit.pos()); + } else { + blockHitTracker.doHit(now, damage); + } + int soundVariant = ThreadLocalRandom.current().nextInt(1, 6); + server.getPlayerManager().broadcastUdpMessage(new SoundMessage("bullet_impact_" + soundVariant, 1, hit.rawPos())); + } deleteProjectile(projectile); } private void handleProjectilePlayerHit(int playerHitType, ServerPlayer hitPlayer, ServerProjectile projectile) { - float damage = 0.4f; - if (playerHitType == 1) damage *= 2; - hitPlayer.setHealth(hitPlayer.getHealth() - damage); - int soundVariant = ThreadLocalRandom.current().nextInt(1, 4); - server.getPlayerManager().broadcastUdpMessage(new SoundMessage("hurt_" + soundVariant, 1, hitPlayer.getPosition(), hitPlayer.getVelocity())); - if (hitPlayer.getHealth() == 0) { - server.getPlayerManager().playerKilled(hitPlayer); - } else { - server.getPlayerManager().getHandler(hitPlayer).sendDatagramPacket(new ClientHealthMessage(hitPlayer.getHealth())); + if (!server.getTeamManager().isProtected(hitPlayer)) { + Gun gun = (Gun) projectile.getSourceItem(); + float damage = gun.getBaseDamage(); + if (playerHitType == 1) damage *= 2; + hitPlayer.setHealth(hitPlayer.getHealth() - damage); + int soundVariant = ThreadLocalRandom.current().nextInt(1, 4); + server.getPlayerManager().broadcastUdpMessage(new SoundMessage("hurt_" + soundVariant, 1, hitPlayer.getPosition(), hitPlayer.getVelocity())); + if (hitPlayer.getHealth() == 0) { + server.getPlayerManager().playerKilled(hitPlayer, projectile.getPlayer()); + } else { + server.getPlayerManager().getHandler(hitPlayer).sendDatagramPacket(new ClientHealthMessage(hitPlayer.getHealth())); + } } deleteProjectile(projectile); } diff --git a/server/src/main/java/nl/andrewl/aos2_server/TeamManager.java b/server/src/main/java/nl/andrewl/aos2_server/TeamManager.java index ff39c84..8850d0d 100644 --- a/server/src/main/java/nl/andrewl/aos2_server/TeamManager.java +++ b/server/src/main/java/nl/andrewl/aos2_server/TeamManager.java @@ -3,6 +3,7 @@ package nl.andrewl.aos2_server; import nl.andrewl.aos2_server.model.ServerPlayer; import nl.andrewl.aos_core.model.Team; import org.joml.Vector3f; +import org.joml.Vector3i; import java.util.Collection; import java.util.Collections; @@ -46,4 +47,16 @@ public class TeamManager { if (team == null) return Collections.emptyList(); return getPlayers(team); } + + public boolean isProtected(Vector3i pos) { + float prot = server.getConfig().actions.teamSpawnProtection; + return prot > 0 && + getTeams().stream().anyMatch(t -> t.getSpawnPoint().distance(pos.x + 0.5f, pos.y + 0.5f, pos.z + 0.5f) <= prot); + } + + public boolean isProtected(ServerPlayer player) { + float prot = server.getConfig().actions.teamSpawnProtection; + return prot > 0 && + getTeams().stream().anyMatch(t -> t.equals(player.getTeam()) && player.getPosition().distance(t.getSpawnPoint()) <= prot); + } } diff --git a/server/src/main/java/nl/andrewl/aos2_server/config/ServerConfig.java b/server/src/main/java/nl/andrewl/aos2_server/config/ServerConfig.java index d837905..dd6e0d9 100644 --- a/server/src/main/java/nl/andrewl/aos2_server/config/ServerConfig.java +++ b/server/src/main/java/nl/andrewl/aos2_server/config/ServerConfig.java @@ -22,8 +22,11 @@ public class ServerConfig { public float blockPlaceCooldown = 0.1f; public float blockBreakReach = 5; public float blockPlaceReach = 5; + public float blockBulletDamageResistance = 3; + public float blockBulletDamageCooldown = 10; public float resupplyCooldown = 30; public float resupplyRadius = 3; + public float teamSpawnProtection = 10; public float movementAccuracyDecreaseFactor = 0.01f; public boolean friendlyFire = false; } diff --git a/server/src/main/java/nl/andrewl/aos2_server/logic/PlayerActionManager.java b/server/src/main/java/nl/andrewl/aos2_server/logic/PlayerActionManager.java index 35cd9db..8bc889f 100644 --- a/server/src/main/java/nl/andrewl/aos2_server/logic/PlayerActionManager.java +++ b/server/src/main/java/nl/andrewl/aos2_server/logic/PlayerActionManager.java @@ -11,10 +11,7 @@ import nl.andrewl.aos_core.model.item.gun.Ak47; import nl.andrewl.aos_core.model.item.gun.Rifle; import nl.andrewl.aos_core.model.item.gun.Winchester; import nl.andrewl.aos_core.model.world.World; -import nl.andrewl.aos_core.net.client.ClientInputState; -import nl.andrewl.aos_core.net.client.InventorySelectedStackMessage; -import nl.andrewl.aos_core.net.client.ItemStackMessage; -import nl.andrewl.aos_core.net.client.SoundMessage; +import nl.andrewl.aos_core.net.client.*; import nl.andrewl.aos_core.net.world.ChunkUpdateMessage; import org.joml.Math; import org.joml.Vector2i; @@ -23,6 +20,7 @@ import org.joml.Vector3i; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ThreadLocalRandom; import static nl.andrewl.aos2_server.model.ServerPlayer.RADIUS; @@ -100,7 +98,7 @@ public class PlayerActionManager { updated = true; } - tickMovement(dt, world, server.getConfig().physics); + tickMovement(dt, server, world, server.getConfig().physics); } private void tickGunAction(long now, Server server, World world, GunItemStack g) { @@ -110,7 +108,8 @@ public class PlayerActionManager { g.getBulletCount() > 0 && !gunReloading && now - gunLastShotAt > gun.getShotCooldownTime() * 1000 && - (gun.isAutomatic() || !gunNeedsReCock) + (gun.isAutomatic() || !gunNeedsReCock) && + !server.getTeamManager().isProtected(player) // Don't allow players to shoot from within their own team's protected zones. ) { server.getProjectileManager().spawnBullets(player, gun); g.setBulletCount(g.getBulletCount() - 1); @@ -165,7 +164,7 @@ public class PlayerActionManager { now - lastBlockRemovedAt > server.getConfig().actions.blockBreakCooldown * 1000 ) { var hit = world.getLookingAtPos(player.getEyePosition(), player.getViewVector(), server.getConfig().actions.blockBreakReach); - if (hit != null) { + if (hit != null && !server.getTeamManager().isProtected(hit.pos())) { world.setBlockAt(hit.pos().x, hit.pos().y, hit.pos().z, (byte) 0); lastBlockRemovedAt = now; stack.incrementAmount(); @@ -181,7 +180,7 @@ public class PlayerActionManager { now - lastBlockPlacedAt > server.getConfig().actions.blockPlaceCooldown * 1000 ) { var hit = world.getLookingAtPos(player.getEyePosition(), player.getViewVector(), server.getConfig().actions.blockPlaceReach); - if (hit != null) { + if (hit != null && !server.getTeamManager().isProtected(hit.pos())) { Vector3i placePos = new Vector3i(hit.pos()); placePos.add(hit.norm()); if (!isSpaceOccupied(placePos)) { // Ensure that we can't place blocks in space we're occupying. @@ -196,7 +195,7 @@ public class PlayerActionManager { } } - private void tickMovement(float dt, World world, ServerConfig.PhysicsConfig config) { + private void tickMovement(float dt, Server server, World world, ServerConfig.PhysicsConfig config) { var velocity = player.getVelocity(); var position = player.getPosition(); boolean grounded = isGrounded(world); @@ -216,10 +215,19 @@ public class PlayerActionManager { if (velocity.lengthSquared() > 0) { Vector3f movement = new Vector3f(velocity).mul(dt); // Check for collisions if we try to move according to what the player wants. - checkBlockCollisions(movement, world); + checkBlockCollisions(movement, server, world); position.add(movement); updated = true; } + + // Finally, check to see if the player is outside the world, and kill them if so. + if ( + player.getPosition().x < world.getMinX() - 5 || player.getPosition().x > world.getMaxX() + 6 || + player.getPosition().z < world.getMinZ() - 5 || player.getPosition().z > world.getMaxZ() + 6 || + player.getPosition().y < world.getMinY() - 50 || player.getPosition().y > world.getMaxY() + 500 + ) { + server.getPlayerManager().playerKilled(player, null); + } } private void tickHorizontalVelocity(ServerConfig.PhysicsConfig config, boolean doDeceleration) { @@ -319,7 +327,7 @@ public class PlayerActionManager { return pos.x >= minX && pos.x <= maxX && pos.y >= minY && pos.y <= maxY && pos.z >= minZ && pos.z <= maxZ; } - private void checkBlockCollisions(Vector3f movement, World world) { + private void checkBlockCollisions(Vector3f movement, Server server, World world) { var position = player.getPosition(); var velocity = player.getVelocity(); final Vector3f nextTickPosition = new Vector3f(position).add(movement); @@ -430,6 +438,19 @@ public class PlayerActionManager { */ boolean collidingWithFloor = playerBodyPrevMinY >= blockMaxY && playerBodyMinY < blockMaxY && world.getBlockAt(x, y + 1, z) <= 0; if (collidingWithFloor) { + // This is a special case! We need to check for fall damage. + if (velocity.y < -20) { + float damage = velocity.y / 200f; + player.setHealth(player.getHealth() + damage); + if (player.getHealth() <= 0) { + server.getPlayerManager().playerKilled(player, player); + } else { + var handler = server.getPlayerManager().getHandler(player.getId()); + handler.sendDatagramPacket(new ClientHealthMessage(player.getHealth())); + int soundVariant = ThreadLocalRandom.current().nextInt(1, 4); + handler.sendDatagramPacket(new SoundMessage("hurt_" + soundVariant, 1, player.getPosition())); + } + } position.y = blockMaxY; velocity.y = 0; movement.y = 0; diff --git a/server/src/main/java/nl/andrewl/aos2_server/logic/WorldUpdater.java b/server/src/main/java/nl/andrewl/aos2_server/logic/WorldUpdater.java index 22470e4..77dee8a 100644 --- a/server/src/main/java/nl/andrewl/aos2_server/logic/WorldUpdater.java +++ b/server/src/main/java/nl/andrewl/aos2_server/logic/WorldUpdater.java @@ -60,6 +60,6 @@ public class WorldUpdater implements Runnable { */ private void tick(long currentTimeMillis) { server.getPlayerManager().tick(currentTimeMillis, secondsPerTick); - server.getProjectileManager().tick(secondsPerTick); + server.getProjectileManager().tick(currentTimeMillis, secondsPerTick); } } diff --git a/server/src/main/java/nl/andrewl/aos2_server/model/BlockHitTracker.java b/server/src/main/java/nl/andrewl/aos2_server/model/BlockHitTracker.java new file mode 100644 index 0000000..8b9d296 --- /dev/null +++ b/server/src/main/java/nl/andrewl/aos2_server/model/BlockHitTracker.java @@ -0,0 +1,29 @@ +package nl.andrewl.aos2_server.model; + +/** + * A simple component that's used to track an individual block's accumulated + * damage from consecutive bullet strikes. This is used to allow for blocks to + * take multiple hits before being destroyed. + */ +public class BlockHitTracker { + private long lastHitAt; + private float damageAccumulated; + + public BlockHitTracker(long now, float initialDamage) { + this.lastHitAt = now; + damageAccumulated = initialDamage; + } + + public void doHit(long now, float damage) { + lastHitAt = now; + damageAccumulated += damage; + } + + public long getLastHitAt() { + return lastHitAt; + } + + public float getDamageAccumulated() { + return damageAccumulated; + } +} diff --git a/server/src/main/java/nl/andrewl/aos2_server/model/ServerProjectile.java b/server/src/main/java/nl/andrewl/aos2_server/model/ServerProjectile.java index a244c8e..5627e23 100644 --- a/server/src/main/java/nl/andrewl/aos2_server/model/ServerProjectile.java +++ b/server/src/main/java/nl/andrewl/aos2_server/model/ServerProjectile.java @@ -1,6 +1,8 @@ package nl.andrewl.aos2_server.model; import nl.andrewl.aos_core.model.Projectile; +import nl.andrewl.aos_core.model.item.Gun; +import nl.andrewl.aos_core.model.item.Item; import nl.andrewl.aos_core.net.client.ProjectileMessage; import org.joml.Vector3f; @@ -11,12 +13,14 @@ import org.joml.Vector3f; */ public class ServerProjectile extends Projectile { private final ServerPlayer player; + private final Item sourceItem; private final Vector3f origin; - public ServerProjectile(int id, Vector3f position, Vector3f velocity, Type type, ServerPlayer player) { + public ServerProjectile(int id, Vector3f position, Vector3f velocity, Type type, ServerPlayer player, Item sourceItem) { super(id, position, velocity, type); this.player = player; this.origin = new Vector3f(position); + this.sourceItem = sourceItem; } public ServerPlayer getPlayer() { @@ -39,4 +43,8 @@ public class ServerProjectile extends Projectile { destroyed ); } + + public Item getSourceItem() { + return sourceItem; + } }