From 6519d80655194a36a9a0b996ca624cac151ce2aa Mon Sep 17 00:00:00 2001 From: HbmMods Date: Mon, 7 Jan 2019 00:12:48 +0100 Subject: [PATCH] new bullet models, relic bomb model and texture, gunbase packets --- assets/hbm/models/bale.obj | 535 ++++++++++++++++++ assets/hbm/textures/models/bale.png | Bin 0 -> 28624 bytes .../entity/projectile/EntityBulletBase.java | 76 ++- com/hbm/handler/BulletConfiguration.java | 15 +- com/hbm/handler/GunConfigFactory.java | 55 ++ com/hbm/handler/GunConfiguration.java | 2 - com/hbm/items/ModItems.java | 4 +- com/hbm/items/weapon/ItemGunBase.java | 80 ++- com/hbm/packet/GunButtonPacket.java | 81 +++ com/hbm/packet/PacketDispatcher.java | 2 + com/hbm/render/entity/RenderRocket.java | 216 +++++++ 11 files changed, 1030 insertions(+), 36 deletions(-) create mode 100644 assets/hbm/models/bale.obj create mode 100644 assets/hbm/textures/models/bale.png create mode 100644 com/hbm/handler/GunConfigFactory.java create mode 100644 com/hbm/packet/GunButtonPacket.java diff --git a/assets/hbm/models/bale.obj b/assets/hbm/models/bale.obj new file mode 100644 index 000000000..10e0a45a8 --- /dev/null +++ b/assets/hbm/models/bale.obj @@ -0,0 +1,535 @@ +# Blender v2.76 (sub 0) OBJ File: 'bale.blend' +# www.blender.org +o Cylinder +v 0.000000 1.000000 -0.500000 +v 0.000000 1.000000 0.750000 +v 0.250000 0.933013 -0.500000 +v 0.250000 0.933013 0.750000 +v 0.433013 0.750000 -0.500000 +v 0.433013 0.750000 0.750000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.750000 +v 0.433013 0.250000 -0.500000 +v 0.433013 0.250000 0.750000 +v 0.250000 0.066987 -0.500000 +v 0.250000 0.066987 0.750000 +v 0.000000 -0.000000 -0.500000 +v 0.000000 0.000000 0.750000 +v -0.250000 0.066987 -0.500000 +v -0.250000 0.066987 0.750000 +v -0.433013 0.250000 -0.500000 +v -0.433013 0.250000 0.750000 +v -0.500000 0.500000 -0.500000 +v -0.500000 0.500000 0.750000 +v -0.433013 0.750000 -0.500000 +v -0.433013 0.750000 0.750000 +v -0.250000 0.933012 -0.500000 +v -0.250000 0.933013 0.750000 +v 0.187500 0.824760 1.000000 +v 0.000000 0.875000 1.000000 +v 0.324760 0.687500 1.000000 +v 0.375000 0.500000 1.000000 +v 0.324760 0.312500 1.000000 +v 0.187500 0.175241 1.000000 +v 0.000000 0.125000 1.000000 +v -0.187500 0.175241 1.000000 +v -0.324759 0.312500 1.000000 +v -0.375000 0.500000 1.000000 +v -0.324760 0.687500 1.000000 +v -0.187500 0.824759 1.000000 +v 0.000000 0.500000 1.150000 +v 0.000000 0.825000 -1.150000 +v 0.162500 0.781458 -1.150000 +v 0.281458 0.662500 -1.150000 +v 0.325000 0.500000 -1.150000 +v 0.281458 0.337500 -1.150000 +v 0.162500 0.218542 -1.150000 +v 0.000000 0.175000 -1.150000 +v -0.162500 0.218542 -1.150000 +v -0.281458 0.337500 -1.150000 +v -0.325000 0.500000 -1.150000 +v -0.281458 0.662500 -1.150000 +v -0.162500 0.781458 -1.150000 +v -0.500000 0.075000 -0.950000 +v 0.500000 0.075000 -0.950000 +v -0.500000 0.925000 -0.950000 +v 0.500000 0.925000 -0.950000 +v -0.425000 0.000000 -0.950000 +v 0.425000 0.000000 -0.950000 +v -0.425000 1.000000 -0.950000 +v 0.425000 1.000000 -0.950000 +v -0.425000 0.925000 -0.950000 +v 0.425000 0.925000 -0.950000 +v -0.425000 0.075000 -0.950000 +v 0.425000 0.075000 -0.950000 +v -0.500000 0.925000 -1.200000 +v -0.500000 0.075000 -1.200000 +v 0.425000 0.925000 -1.200000 +v 0.425000 0.075000 -1.200000 +v 0.500000 0.075000 -1.200000 +v 0.500000 0.925000 -1.200000 +v -0.425000 0.925000 -1.200000 +v -0.425000 0.075000 -1.200000 +v -0.425000 -0.000000 -1.200000 +v 0.425000 -0.000000 -1.200000 +v 0.425000 1.000000 -1.200000 +v -0.425000 1.000000 -1.200000 +v -0.459619 0.075736 -1.000000 +v 0.424264 0.959619 -1.000000 +v -0.459619 0.075736 -1.150000 +v 0.424264 0.959619 -1.150000 +v -0.424264 0.040381 -1.000000 +v 0.459619 0.924264 -1.000000 +v -0.424264 0.040381 -1.150000 +v 0.459619 0.924264 -1.150000 +v 0.000000 0.825000 -1.200000 +v 0.162500 0.781458 -1.200000 +v 0.281458 0.662500 -1.200000 +v 0.325000 0.500000 -1.200000 +v 0.281458 0.337500 -1.200000 +v 0.162500 0.218542 -1.200000 +v 0.000000 0.175000 -1.200000 +v -0.162500 0.218542 -1.200000 +v -0.281458 0.337500 -1.200000 +v -0.325000 0.500000 -1.200000 +v -0.281458 0.662500 -1.200000 +v -0.162500 0.781458 -1.200000 +v -0.424264 0.959619 -1.000000 +v 0.459619 0.075736 -1.000000 +v -0.424264 0.959619 -1.150000 +v 0.459619 0.075736 -1.150000 +v -0.459619 0.924264 -1.000000 +v 0.424264 0.040381 -1.000000 +v -0.459619 0.924264 -1.150000 +v 0.424264 0.040381 -1.150000 +vt 0.788698 0.361775 +vt 0.510343 0.361775 +vt 0.510343 0.304140 +vt 0.510343 0.246505 +vt 0.788698 0.246505 +vt 0.510343 0.188870 +vt 0.788698 0.188870 +vt 0.510343 0.131235 +vt 0.510343 0.073600 +vt 0.788698 0.073600 +vt 0.510343 0.015964 +vt 0.788698 0.015964 +vt 0.788698 0.707585 +vt 0.510343 0.707585 +vt 0.510343 0.649950 +vt 0.788698 0.649950 +vt 0.510343 0.592315 +vt 0.510343 0.534680 +vt 0.788698 0.534680 +vt 0.510343 0.477045 +vt 0.788698 0.477045 +vt 0.448519 0.124030 +vt 0.448519 0.080804 +vt 0.510343 0.419410 +vt 0.788698 0.419410 +vt 0.938258 0.198956 +vt 0.938258 0.236419 +vt 0.448519 0.181665 +vt 0.448519 0.138439 +vt 0.448519 0.412206 +vt 0.448519 0.354571 +vt 0.448519 0.311344 +vt 0.448519 0.239300 +vt 0.448519 0.196074 +vt 0.448519 0.469841 +vt 0.448519 0.296935 +vt 0.448519 0.253709 +vt 0.448519 0.527476 +vt 0.448519 0.484250 +vt 0.448519 0.585111 +vt 0.448519 0.541885 +vt 0.448519 0.642746 +vt 0.448519 0.599520 +vt 0.448519 0.700381 +vt 0.448519 0.657155 +vt 0.448519 0.066395 +vt 0.361215 0.678768 +vt 0.361214 0.621133 +vt 0.361215 0.563498 +vt 0.361215 0.505863 +vt 0.361215 0.448228 +vt 0.448519 0.426615 +vt 0.361215 0.390593 +vt 0.448519 0.368979 +vt 0.361215 0.332957 +vt 0.448519 0.023169 +vt 0.361215 0.044782 +vt 0.361214 0.102417 +vt 0.361215 0.160052 +vt 0.361215 0.217687 +vt 0.361215 0.275322 +vt 0.938258 0.141321 +vt 0.949392 0.141321 +vt 0.949392 0.178784 +vt 0.938258 0.429496 +vt 0.938258 0.466959 +vt 0.788698 0.304140 +vt 0.938258 0.256591 +vt 0.938258 0.487131 +vt 0.788698 0.592315 +vt 0.938258 0.544766 +vt 0.938258 0.602401 +vt 0.938258 0.639864 +vt 0.938258 0.660037 +vt 0.938258 0.697499 +vt 0.938258 0.026051 +vt 0.938258 0.063514 +vt 0.938258 0.083686 +vt 0.938258 0.121149 +vt 0.788698 0.131235 +vt 0.938258 0.178784 +vt 0.938258 0.371861 +vt 0.938258 0.409324 +vt 0.938258 0.314226 +vt 0.938258 0.351689 +vt 0.680346 0.943229 +vt 0.680346 0.959931 +vt 0.491064 0.959931 +vt 0.680346 0.753947 +vt 0.491064 0.753947 +vt 0.491064 0.737246 +vt 0.491064 0.943229 +vt 0.474362 0.943229 +vt 0.474362 0.753947 +vt 0.697047 0.753947 +vt 0.680346 0.737246 +vt 0.697047 0.943229 +vt 0.932691 0.959931 +vt 0.743409 0.959931 +vt 0.743409 0.943229 +vt 0.932691 0.737246 +vt 0.932691 0.753947 +vt 0.743409 0.753947 +vt 0.949392 0.753947 +vt 0.949392 0.943229 +vt 0.932691 0.943229 +vt 0.726707 0.753947 +vt 0.743409 0.737246 +vt 0.726707 0.943229 +vt 0.190552 0.394528 +vt 0.190552 0.205246 +vt 0.246223 0.205246 +vt 0.331554 0.228866 +vt 0.275883 0.228866 +vt 0.275883 0.205247 +vt 0.331554 0.418148 +vt 0.275883 0.418148 +vt 0.331554 0.631049 +vt 0.275883 0.631049 +vt 0.275883 0.441767 +vt 0.190551 0.015964 +vt 0.246223 0.015964 +vt 0.331554 0.867570 +vt 0.275883 0.867570 +vt 0.275883 0.843951 +vt 0.190552 0.583811 +vt 0.246223 0.583811 +vt 0.246223 0.773093 +vt 0.331554 0.654669 +vt 0.275883 0.654669 +vt 0.331554 0.205247 +vt 0.275883 0.015964 +vt 0.331554 0.843951 +vt 0.331554 0.441767 +vt 0.246223 0.394528 +vt 0.053199 0.941767 +vt 0.331554 0.941767 +vt 0.331554 0.975170 +vt 0.053199 0.930633 +vt 0.331554 0.930633 +vt 0.053198 0.897230 +vt 0.331554 0.897230 +vt 0.053199 0.975170 +vt 0.331554 0.986304 +vt 0.127488 0.015964 +vt 0.127488 0.294321 +vt 0.116354 0.294321 +vt 0.116354 0.015964 +vt 0.082952 0.294321 +vt 0.039809 0.445063 +vt 0.142160 0.342712 +vt 0.160891 0.412619 +vt 0.949392 0.429496 +vt 0.949392 0.466959 +vt 0.949392 0.314226 +vt 0.949392 0.351689 +vt 0.949392 0.602401 +vt 0.949392 0.639864 +vt 0.949392 0.083686 +vt 0.949392 0.121149 +vt 0.949392 0.371861 +vt 0.949392 0.409324 +vt 0.949392 0.256591 +vt 0.949392 0.294054 +vt 0.949392 0.544766 +vt 0.949392 0.582229 +vt 0.949392 0.026051 +vt 0.949392 0.198956 +vt 0.949392 0.236419 +vt 0.949392 0.487131 +vt 0.949392 0.524594 +vt 0.949392 0.660037 +vt 0.949392 0.697499 +vt 0.160891 0.015964 +vt 0.160891 0.294321 +vt 0.082951 0.015964 +vt 0.071817 0.294321 +vt 0.938258 0.294054 +vt 0.938258 0.524594 +vt 0.938258 0.582229 +vt 0.190551 0.773093 +vt 0.331554 0.015964 +vt 0.053199 0.986304 +vt 0.142160 0.445063 +vt 0.109716 0.463794 +vt 0.072253 0.463794 +vt 0.021078 0.412619 +vt 0.021078 0.375156 +vt 0.039809 0.342712 +vt 0.072253 0.323981 +vt 0.109716 0.323981 +vt 0.160891 0.375156 +vt 0.949392 0.063513 +vt 0.071817 0.015964 +vn 0.258800 0.965900 0.000000 +vn 0.707100 0.707100 0.000000 +vn 0.965900 0.258800 0.000000 +vn 0.965900 -0.258800 0.000000 +vn 0.707100 -0.707100 0.000000 +vn 0.258800 -0.965900 0.000000 +vn -0.258800 -0.965900 0.000000 +vn -0.707100 -0.707100 0.000000 +vn -0.965900 -0.258800 0.000000 +vn -0.965900 0.258800 -0.000000 +vn 0.636700 -0.636700 0.434900 +vn -0.258800 0.965900 -0.000000 +vn -0.707100 0.707100 -0.000000 +vn 0.934800 0.250500 -0.251700 +vn 0.869800 -0.233100 0.434900 +vn -0.233100 0.869800 0.434900 +vn 0.233100 0.869800 0.434900 +vn 0.869800 0.233100 0.434900 +vn -0.636700 0.636700 0.434900 +vn 0.636700 0.636700 0.434900 +vn -0.869800 0.233100 0.434900 +vn -0.869800 -0.233100 0.434900 +vn -0.636700 -0.636700 0.434900 +vn -0.233100 -0.869800 0.434900 +vn 0.233100 -0.869800 0.434900 +vn -0.099000 -0.369600 0.923900 +vn -0.270500 -0.270500 0.923900 +vn -0.369600 -0.099000 0.923900 +vn -0.369600 0.099000 0.923900 +vn -0.270500 0.270500 0.923900 +vn -0.099000 0.369600 0.923900 +vn 0.099000 0.369600 0.923900 +vn 0.099000 -0.369600 0.923900 +vn 0.270500 -0.270500 0.923900 +vn 0.369600 -0.099000 0.923900 +vn 0.369600 0.099000 0.923900 +vn 0.270500 0.270500 0.923900 +vn -0.684300 0.684300 -0.251700 +vn 0.684300 0.684300 -0.251700 +vn -0.934800 0.250500 -0.251700 +vn -0.934800 -0.250500 -0.251700 +vn -0.684300 -0.684300 -0.251700 +vn -0.250500 -0.934800 -0.251700 +vn 0.250500 -0.934800 -0.251700 +vn 0.684300 -0.684300 -0.251700 +vn 0.934800 -0.250500 -0.251700 +vn -0.250500 0.934800 -0.251700 +vn 0.250500 0.934800 -0.251700 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +s off +f 1/1/1 2/2/1 4/3/1 +f 4/3/2 6/4/2 5/5/2 +f 5/5/3 6/4/3 8/6/3 +f 7/7/4 8/6/4 10/8/4 +f 10/8/5 12/9/5 11/10/5 +f 12/9/6 14/11/6 13/12/6 +f 13/13/7 14/14/7 16/15/7 +f 15/16/8 16/15/8 18/17/8 +f 18/17/9 20/18/9 19/19/9 +f 20/18/10 22/20/10 21/21/10 +f 10/8/11 29/22/11 30/23/11 +f 24/24/12 2/2/12 1/1/12 +f 22/20/13 24/24/13 23/25/13 +f 7/7/14 41/26/14 40/27/14 +f 8/6/15 28/28/15 29/29/15 +f 2/2/16 24/24/16 36/30/16 +f 2/2/17 26/31/17 25/32/17 +f 6/4/18 27/33/18 28/34/18 +f 24/24/19 22/20/19 35/35/19 +f 4/3/20 25/36/20 27/37/20 +f 20/18/21 34/38/21 35/39/21 +f 18/17/22 33/40/22 34/41/22 +f 16/15/23 32/42/23 33/43/23 +f 14/14/24 31/44/24 32/45/24 +f 14/11/25 12/9/25 30/46/25 +f 31/44/26 37/47/26 32/45/26 +f 32/42/27 37/48/27 33/43/27 +f 33/40/28 37/49/28 34/41/28 +f 34/38/29 37/50/29 35/39/29 +f 35/35/30 37/51/30 36/52/30 +f 36/30/31 37/53/31 26/54/31 +f 26/31/32 37/55/32 25/32/32 +f 31/56/33 30/46/33 37/57/33 +f 29/22/34 37/58/34 30/23/34 +f 28/28/35 37/59/35 29/29/35 +f 27/33/36 37/60/36 28/34/36 +f 25/36/37 37/61/37 27/37/37 +f 42/62/4 86/63/4 85/64/4 +f 23/25/38 49/65/38 48/66/38 +f 3/67/39 5/5/39 40/68/39 +f 19/19/40 21/21/40 48/69/40 +f 17/70/41 19/19/41 47/71/41 +f 17/70/42 46/72/42 45/73/42 +f 15/16/43 45/74/43 44/75/43 +f 13/12/44 44/76/44 43/77/44 +f 11/10/45 43/78/45 42/79/45 +f 9/80/46 42/62/46 41/81/46 +f 1/1/47 38/82/47 49/83/47 +f 3/67/48 39/84/48 38/85/48 +f 61/86/49 51/87/49 53/88/49 +f 60/89/49 58/90/49 52/91/49 +f 59/92/49 57/93/49 56/94/49 +f 53/88/49 57/93/49 59/92/49 +f 56/94/49 52/91/49 58/90/49 +f 54/95/49 60/89/49 50/96/49 +f 51/87/49 61/86/49 55/97/49 +f 60/89/49 54/95/49 55/97/49 +f 67/98/50 66/99/50 65/100/50 +f 62/101/50 68/102/50 69/103/50 +f 73/104/50 72/105/50 64/106/50 +f 67/98/50 64/106/50 72/105/50 +f 73/104/50 68/102/50 62/101/50 +f 70/107/50 63/108/50 69/103/50 +f 66/99/50 71/109/50 65/100/50 +f 71/109/50 70/107/50 69/103/50 +f 58/110/51 60/111/51 69/112/51 +f 50/113/8 63/114/8 70/115/8 +f 52/116/52 62/117/52 63/114/52 +f 57/118/53 72/119/53 73/120/53 +f 61/121/53 65/122/53 69/112/53 +f 55/123/5 71/124/5 66/125/5 +f 59/126/52 64/127/52 65/128/52 +f 53/129/2 67/130/2 72/119/2 +f 54/131/54 70/115/54 71/132/54 +f 53/129/51 51/133/51 66/125/51 +f 56/134/13 73/120/13 62/117/13 +f 58/110/54 68/135/54 64/127/54 +f 77/136/13 76/137/13 74/138/13 +f 81/139/50 80/140/50 76/137/50 +f 79/141/5 78/142/5 80/140/5 +f 75/143/49 74/138/49 78/144/49 +f 101/145/50 100/146/50 96/147/50 +f 97/148/2 96/147/2 94/149/2 +f 85/150/50 91/151/50 93/152/50 +f 49/65/13 93/153/13 92/154/13 +f 39/84/1 83/155/1 82/156/1 +f 46/72/8 90/157/8 89/158/8 +f 43/78/5 87/159/5 86/160/5 +f 38/82/12 82/161/12 93/162/12 +f 40/68/2 84/163/2 83/164/2 +f 47/71/9 91/165/9 90/166/9 +f 43/77/6 44/76/6 88/167/6 +f 41/26/3 85/168/3 84/169/3 +f 48/69/10 92/170/10 91/171/10 +f 45/74/7 89/172/7 88/173/7 +f 99/174/8 98/175/8 100/146/8 +f 95/176/49 94/149/49 98/177/49 +f 3/67/1 1/1/1 4/3/1 +f 3/67/2 4/3/2 5/5/2 +f 7/7/3 5/5/3 8/6/3 +f 9/80/4 7/7/4 10/8/4 +f 9/80/5 10/8/5 11/10/5 +f 11/10/6 12/9/6 13/12/6 +f 15/16/7 13/13/7 16/15/7 +f 17/70/8 15/16/8 18/17/8 +f 17/70/9 18/17/9 19/19/9 +f 19/19/10 20/18/10 21/21/10 +f 12/9/11 10/8/11 30/23/11 +f 23/25/12 24/24/12 1/1/12 +f 21/21/13 22/20/13 23/25/13 +f 5/5/14 7/7/14 40/27/14 +f 10/8/15 8/6/15 29/29/15 +f 26/54/16 2/2/16 36/30/16 +f 4/3/17 2/2/17 25/32/17 +f 8/6/18 6/4/18 28/34/18 +f 36/52/19 24/24/19 35/35/19 +f 6/4/20 4/3/20 27/37/20 +f 22/20/21 20/18/21 35/39/21 +f 20/18/22 18/17/22 34/41/22 +f 18/17/23 16/15/23 33/43/23 +f 16/15/24 14/14/24 32/45/24 +f 31/56/25 14/11/25 30/46/25 +f 41/81/4 42/62/4 85/64/4 +f 21/21/38 23/25/38 48/66/38 +f 39/178/39 3/67/39 40/68/39 +f 47/179/40 19/19/40 48/69/40 +f 46/180/41 17/70/41 47/71/41 +f 15/16/42 17/70/42 45/73/42 +f 13/13/43 15/16/43 44/75/43 +f 11/10/44 13/12/44 43/77/44 +f 9/80/45 11/10/45 42/79/45 +f 7/7/46 9/80/46 41/81/46 +f 23/25/47 1/1/47 49/83/47 +f 1/1/48 3/67/48 38/85/48 +f 59/92/49 61/86/49 53/88/49 +f 50/96/49 60/89/49 52/91/49 +f 58/90/49 59/92/49 56/94/49 +f 61/86/49 60/89/49 55/97/49 +f 64/106/50 67/98/50 65/100/50 +f 63/108/50 62/101/50 69/103/50 +f 68/102/50 73/104/50 64/106/50 +f 65/100/50 71/109/50 69/103/50 +f 68/135/51 58/110/51 69/112/51 +f 54/131/8 50/113/8 70/115/8 +f 50/113/52 52/116/52 63/114/52 +f 56/134/53 57/118/53 73/120/53 +f 60/111/53 61/121/53 69/112/53 +f 51/133/5 55/123/5 66/125/5 +f 61/181/52 59/126/52 65/128/52 +f 57/118/2 53/129/2 72/119/2 +f 55/182/54 54/131/54 71/132/54 +f 67/130/51 53/129/51 66/125/51 +f 52/116/13 56/134/13 62/117/13 +f 59/126/54 58/110/54 64/127/54 +f 75/143/13 77/136/13 74/138/13 +f 77/136/50 81/139/50 76/137/50 +f 81/139/5 79/141/5 80/140/5 +f 79/183/49 75/143/49 78/144/49 +f 97/148/50 101/145/50 96/147/50 +f 95/176/2 97/148/2 94/149/2 +f 93/152/50 82/184/50 85/150/50 +f 83/185/50 84/186/50 85/150/50 +f 85/150/50 86/187/50 87/188/50 +f 87/188/50 88/189/50 89/190/50 +f 89/190/50 90/191/50 91/151/50 +f 91/151/50 92/192/50 93/152/50 +f 82/184/50 83/185/50 85/150/50 +f 85/150/50 87/188/50 89/190/50 +f 89/190/50 91/151/50 85/150/50 +f 48/66/13 49/65/13 92/154/13 +f 38/85/1 39/84/1 82/156/1 +f 45/73/8 46/72/8 89/158/8 +f 42/79/5 43/78/5 86/160/5 +f 49/83/12 38/82/12 93/162/12 +f 39/178/2 40/68/2 83/164/2 +f 46/180/9 47/71/9 90/166/9 +f 87/193/6 43/77/6 88/167/6 +f 40/27/3 41/26/3 84/169/3 +f 47/179/10 48/69/10 91/171/10 +f 44/75/7 45/74/7 88/173/7 +f 101/145/8 99/174/8 100/146/8 +f 99/194/49 95/176/49 98/177/49 diff --git a/assets/hbm/textures/models/bale.png b/assets/hbm/textures/models/bale.png new file mode 100644 index 0000000000000000000000000000000000000000..908a0480f72d38e9b72c1cd11234e01d6c43b858 GIT binary patch literal 28624 zcmXt9bySn@+owS!1-^8vFhO7{F}eh$8>J+qyQI63l#m!DjvgW~dUQw)5E)Wqp1AMp`qZ7Eqoqno&O(ldhe!GLjj|qYAO63Mj0E@DCu=o|+mTqS zt19E&|LCfq?%pSPN?N!Rd67+#4z^QvdS!{fqx ztE^z)Kfebb{b6hRY4eQrq!o$6Fo++F2f5ox(%H}3&OM>2|M>L@FSi2q4W0P`}jJ+;9#K?BtjCKWIjJt=PtbG;!AiEC_qxiMr;UN5>Gjn%$ z_bJah_{UdU?&$EUe8k~w%^3eN@ijLN&+tC*@%24ZQ?|HU6~0^DrBS>( z`*44j+;xAWeibcu&j|N>pZ(-kwd?Tge&0Y6?ng6p_2mtKr<-Po=_P=q8+d9Hc|#Pp zMQhkbrAU^k=Ln~RD-Br!vXEIRI{(lf5@>jN)1d9}B~67~KytjuAUcf~Bq1wl=T_bw zcG7+!u3aR1d)<64e6)6V^Py&Uq{+1(O_M1`VnYF@bJ{&ENdnTyGxR^GN~BW&E4^k? z(lw0j)uExq8`Qz;paYXhN|yTh@FN~X-kK3v*Zn=^k-*S+N(Y?_;@x6DEG%1-ka3^V zC~iq)OZuBVt0LTwf{B3}7#{_5JwCK>gf@uyFS39nq$jrpA-X0u&IQ0sh>sfX3}`XT zrll!r`+Wp&NZ{0MktZTZtzmpmD&gL*A3_6ecB+4H+!06KqQUK*t*xM7jMTCx?m}jm zY{Jg>-UkH-FIsekLUBjVnwy(FC!+g;gr{Ex&>lfy7HZ6>Am#o6rj5-_m4kzWKmg=+ zh4Zc?@eKucKQOi<^wz`~3d!`M;uZwie^3JoeQzQ4P$EyUa$4RKy;%U&sKm1hLq-GDAGF7Vi>NXs1cXiF{-(i6wq&E03e6!!xO!I^^Zq)(0rX;Vd6T=<( zMp1=N0zVVge&0hKnijs{&bH0XmNK+9>*nq*7lyl*^3i%TnV|EU_&0_#qkVl!MPFXTejIw>RGBP>iCF?YW>aSOga9u+RA+N9|{ z9p)=)#Et(U;NZ#hwoh1C*s?kxj;41Ab-gA%u~wQY>ji)WhlPFM`K6{l>f86z>9s-d}`;u_|r%{SM|NWU#+J(+R}>qRD%uM-P^FjM5XB zmx^OkVB=}pb8;4hm5}$$-K9uG(ka%#KSGm>)2x-1-&N0W*qT4!AL5UuAwe(OUvW~! zRcp)Lo;KWHE?>pnkKWGvn>`!~uuej-NvC4mMb3AJ&~x+h7Yt2VgX5kmh6$+j4khOJ zheo@NTCS9wJR3IGGR{9;0w}Zt0+VhS@2BOiFT4=@a@Rxm=l3`NI_fhAU)fqG88GOP zRgiss@}lE!F{bMTwFco$N@xU^ty(%m}o-eF>SAO?yw8MJm)Or(IevHo6q^8AoTH}b;7M_Iq)Y{%xe;8WLJ zgWcUnEj43PYyA=3Y;2%F6Jx!@Xv!22O=Nkd*Y(ZS$!wS{-p!`_ot+Fv>fLe1a&e

@SpZ@u*!=300N?DoDx6 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

-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

et0C$qSTYf) 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 literal 0 HcmV?d00001 diff --git a/com/hbm/entity/projectile/EntityBulletBase.java b/com/hbm/entity/projectile/EntityBulletBase.java index 0b20a6151..e1b4395ae 100644 --- a/com/hbm/entity/projectile/EntityBulletBase.java +++ b/com/hbm/entity/projectile/EntityBulletBase.java @@ -1,26 +1,90 @@ package com.hbm.entity.projectile; +import com.hbm.handler.BulletConfiguration; + import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IProjectile; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class EntityBulletBase extends Entity implements IProjectile { + + private BulletConfiguration config; + private EntityLivingBase shooter; - public EntityBulletBase(World p_i1582_1_) { - super(p_i1582_1_); + private EntityBulletBase(World world) { super(world); } + + private EntityBulletBase(World world, BulletConfiguration config) { + super(world); + this.config = config; + + this.setSize(0.5F, 0.5F); + } + + public EntityBulletBase(World world, BulletConfiguration config, EntityLivingBase entity, float vel) { + super(world); + this.config = config; + shooter = entity; + + this.setLocationAndAngles(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ, entity.rotationYaw, entity.rotationPitch); + + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.posY -= 0.10000000149011612D; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); + this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); + this.motionY = (-MathHelper.sin(this.rotationPitch / 180.0F * (float) Math.PI)); + + this.setSize(0.5F, 0.5F); } @Override - public void setThrowableHeading(double p_70186_1_, double p_70186_3_, double p_70186_5_, float p_70186_7_, - float p_70186_8_) { - // TODO Auto-generated method stub + public void setThrowableHeading(double moX, double moY, double moZ, float mult1, float mult2) { + + float deviation = 0; + + if(config != null) + deviation = config.spread; + + float f2 = MathHelper.sqrt_double(moX * moX + moY * moY + moZ * moZ); + moX /= f2; + moY /= f2; + moZ /= f2; + moX += this.rand.nextGaussian() * /*(this.rand.nextBoolean() ? -1 : 1) **/ deviation * mult2; + moY += this.rand.nextGaussian() * /*(this.rand.nextBoolean() ? -1 : 1) **/ deviation * mult2; + moZ += this.rand.nextGaussian() * /*(this.rand.nextBoolean() ? -1 : 1) **/ deviation * mult2; + moX *= mult1; + moY *= mult1; + moZ *= mult1; + this.motionX = moX; + this.motionY = moY; + this.motionZ = moZ; + + float f3 = MathHelper.sqrt_double(moX * moX + moZ * moZ); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(moX, moZ) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(moY, f3) * 180.0D / Math.PI); } @Override protected void entityInit() { - // TODO Auto-generated method stub + //style + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); + } + + @Override + public void onUpdate() { + + super.onUpdate(); + + if(config == null) { + this.setDead(); + return; + } } diff --git a/com/hbm/handler/BulletConfiguration.java b/com/hbm/handler/BulletConfiguration.java index 4018dfa08..2be584a36 100644 --- a/com/hbm/handler/BulletConfiguration.java +++ b/com/hbm/handler/BulletConfiguration.java @@ -1,11 +1,16 @@ package com.hbm.handler; +import java.util.List; + import net.minecraft.item.Item; +import net.minecraft.potion.PotionEffect; public class BulletConfiguration { //what item this specific configuration consumes public Item ammo; + //spread of bullets in gaussian range + public float spread; //damage bounds public float dmgMin; @@ -13,6 +18,8 @@ public class BulletConfiguration { //acceleration torwards neg Y public double gravity; + //max age in ticks before despawning + public int maxAge; //whether the projectile should be able to bounce off of blocks public boolean doesRicochet; @@ -25,18 +32,18 @@ public class BulletConfiguration { public boolean doesBreakGlass; //bullet effects + public List effects; public int incendiary; - public int poison; - public int wither; public int emp; - public int stun; public int explosive; public int rainbow; public int nuke; public boolean boxcar; public boolean destroysBlocks; - //appearance for rendering + //appearance public int style; + //0: no plinking, 1: bullet plink, 2: grenade plink + public int plink; } diff --git a/com/hbm/handler/GunConfigFactory.java b/com/hbm/handler/GunConfigFactory.java new file mode 100644 index 000000000..0322a2a04 --- /dev/null +++ b/com/hbm/handler/GunConfigFactory.java @@ -0,0 +1,55 @@ +package com.hbm.handler; + +import java.util.ArrayList; + +import com.hbm.items.ModItems; + +public class GunConfigFactory { + + public static GunConfiguration getRevolverConfig() { + + BulletConfiguration bullet = new BulletConfiguration(); + + bullet.ammo = ModItems.gun_revolver_lead_ammo; + bullet.spread = 0F; + bullet.dmgMin = 15; + bullet.dmgMax = 17; + bullet.gravity = 0D; + bullet.maxAge = 100; + bullet.doesRicochet = true; + bullet.ricochetAngle = 15; + bullet.doesPenetrate = true; + bullet.doesBreakGlass = true; + bullet.incendiary = 0; + bullet.emp = 0; + bullet.rainbow = 0; + bullet.nuke = 0; + bullet.boxcar = false; + bullet.destroysBlocks = false; + bullet.style = 0; + bullet.plink = 1; + + GunConfiguration config = new GunConfiguration(); + + config.rateOfFire = 20; + config.bulletsMin = 1; + config.bulletsMax = 1; + config.gunMode = 0; + config.firingMode = 0; + config.hasReloadAnim = false; + config.hasFiringAnim = false; + config.hasSpinup = false; + config.hasSpindown = false; + config.reloadDuration = 0; + config.firingDuration = 0; + config.ammoCap = 6; + config.reloadType = 1; + config.allowsInfinity = true; + + config.config = new ArrayList(); + config.config.add(bullet); + + return config; + } + +} diff --git a/com/hbm/handler/GunConfiguration.java b/com/hbm/handler/GunConfiguration.java index d3195c52f..64627c6ba 100644 --- a/com/hbm/handler/GunConfiguration.java +++ b/com/hbm/handler/GunConfiguration.java @@ -14,8 +14,6 @@ public class GunConfiguration { public int gunMode; //0 = manual, 1 = automatic public int firingMode; - //spread of bullets in gaussian range - public float spread; //whether or not there is a reload delay animation public boolean hasReloadAnim; diff --git a/com/hbm/items/ModItems.java b/com/hbm/items/ModItems.java index 6b07b7140..3beda26bf 100644 --- a/com/hbm/items/ModItems.java +++ b/com/hbm/items/ModItems.java @@ -2,6 +2,7 @@ package com.hbm.items; import com.hbm.blocks.ModBlocks; import com.hbm.handler.BucketHandler; +import com.hbm.handler.GunConfigFactory; import com.hbm.items.bomb.*; import com.hbm.items.food.*; import com.hbm.items.gear.*; @@ -2176,7 +2177,8 @@ public class ModItems { gun_skystinger = new GunStinger().setUnlocalizedName("gun_skystinger").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_skystinger"); gun_stinger_ammo = new Item().setUnlocalizedName("gun_stinger_ammo").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_stinger_ammo"); gun_revolver_ammo = new Item().setUnlocalizedName("gun_revolver_ammo").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_revolver_ammo"); - gun_revolver = new GunRevolver(gun_revolver_ammo, 10, 25, false, false).setMaxDamage(500).setUnlocalizedName("gun_revolver").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_revolver"); + //gun_revolver = new GunRevolver(gun_revolver_ammo, 10, 25, false, false).setMaxDamage(500).setUnlocalizedName("gun_revolver").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_revolver"); + gun_revolver = new ItemGunBase(GunConfigFactory.getRevolverConfig()).setUnlocalizedName("gun_revolver").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_revolver"); gun_revolver_saturnite = new GunRevolver(gun_revolver_ammo, 20, 35, false, false).setMaxDamage(2500).setUnlocalizedName("gun_revolver_saturnite").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_revolver_saturnite"); gun_revolver_iron_ammo = new Item().setUnlocalizedName("gun_revolver_iron_ammo").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_revolver_iron_ammo"); gun_revolver_iron = new GunRevolver(gun_revolver_iron_ammo, 5, 15, false, false).setMaxDamage(100).setUnlocalizedName("gun_revolver_iron").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_revolver_iron"); diff --git a/com/hbm/items/weapon/ItemGunBase.java b/com/hbm/items/weapon/ItemGunBase.java index 03c86688b..37b33cfad 100644 --- a/com/hbm/items/weapon/ItemGunBase.java +++ b/com/hbm/items/weapon/ItemGunBase.java @@ -7,9 +7,12 @@ import org.lwjgl.input.Mouse; import com.hbm.handler.GunConfiguration; import com.hbm.interfaces.IHoldableWeapon; +import com.hbm.packet.GunButtonPacket; +import com.hbm.packet.PacketDispatcher; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; +import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -21,6 +24,15 @@ public class ItemGunBase extends Item implements IHoldableWeapon { private GunConfiguration mainConfig; private GunConfiguration altConfig; + + public ItemGunBase(GunConfiguration config) { + mainConfig = config; + } + + public ItemGunBase(GunConfiguration config, GunConfiguration alt) { + mainConfig = config; + altConfig = alt; + } @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { @@ -30,50 +42,62 @@ public class ItemGunBase extends Item implements IHoldableWeapon { @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isCurrentItem) { - if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) { - - boolean left = getIsMouseDown(stack); - boolean right = getIsAltDown(stack); - + if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT && entity instanceof EntityPlayer && world.isRemote) { + updateClient(stack, world, (EntityPlayer)entity, slot, isCurrentItem); + } else { + updateServer(stack, world, (EntityPlayer)entity, slot, isCurrentItem); + } + + } + + private void updateClient(ItemStack stack, World world, EntityPlayer entity, int slot, boolean isCurrentItem) { + + boolean clickLeft = Mouse.isButtonDown(0); + boolean clickRight = Mouse.isButtonDown(1); + boolean left = getIsMouseDown(stack); + boolean right = getIsAltDown(stack); + + if(isCurrentItem) { if(left && right) { - //TODO: stop both with packet + PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(false, (byte) 0)); + PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(false, (byte) 1)); setIsMouseDown(stack, false); setIsAltDown(stack, false); } if(!left && !right) { - if(Mouse.isButtonDown(0)) { - //TODO: start with packet + if(clickLeft) { + PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(true, (byte) 0)); setIsMouseDown(stack, true); - } else if(Mouse.isButtonDown(0)) { - //TODO: start with packet + } else if(clickRight) { + PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(true, (byte) 1)); setIsAltDown(stack, true); } } - if(left && !Mouse.isButtonDown(0)) { - //TODO: stop with packet + if(left && !clickLeft) { + PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(false, (byte) 0)); setIsMouseDown(stack, false); } - if(right && !Mouse.isButtonDown(1)) { - //TODO: stop with packet + if(right && !clickRight) { + PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(false, (byte) 1)); setIsAltDown(stack, false); } if(mainConfig.reloadType != 0 || (altConfig != null && altConfig.reloadType != 0)) { if(Keyboard.isKeyDown(Keyboard.KEY_R)) { - + PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(true, (byte) 2)); + setIsReloading(stack, true); } - //TODO: reload with packet } - - } else { - } - - } + } + + private void updateServer(ItemStack stack, World world, EntityPlayer entity, int slot, boolean isCurrentItem) { + + } //called every time the gun shoots private void fire(ItemStack stack, World world, EntityPlayer player) { @@ -101,6 +125,16 @@ public class ItemGunBase extends Item implements IHoldableWeapon { } + /*//returns main config from itemstack + public static GunConfiguration extractConfig(ItemStack stack) { + + if(stack != null && stack.getItem() instanceof ItemGunBase) { + return ((ItemGunBase)stack.getItem()).mainConfig; + } + + return null; + }*/ + /// if reloading routine is active /// public static void setIsReloading(ItemStack stack, boolean b) { writeNBT(stack, "isReloading", b ? 1 : 0); @@ -147,11 +181,11 @@ public class ItemGunBase extends Item implements IHoldableWeapon { } /// R/W reload animation timer /// - public static void setReloadAnim(ItemStack stack, int i) { + public static void setReloadCycle(ItemStack stack, int i) { writeNBT(stack, "reload", i); } - public static int getReloadAnim(ItemStack stack) { + public static int getReloadCycle(ItemStack stack) { return readNBT(stack, "reload"); } diff --git a/com/hbm/packet/GunButtonPacket.java b/com/hbm/packet/GunButtonPacket.java new file mode 100644 index 000000000..3fa2a87b0 --- /dev/null +++ b/com/hbm/packet/GunButtonPacket.java @@ -0,0 +1,81 @@ +package com.hbm.packet; + +import com.hbm.explosion.ExplosionLarge; +import com.hbm.handler.FluidTypeHandler.FluidType; +import com.hbm.items.weapon.ItemGunBase; +import com.hbm.saveddata.SatelliteSaveStructure; +import com.hbm.saveddata.SatelliteSavedData; +import com.hbm.tileentity.bomb.TileEntityTurretCIWS; +import com.hbm.tileentity.bomb.TileEntityTurretCheapo; +import com.hbm.tileentity.machine.TileEntityAMSBase; +import com.hbm.tileentity.machine.TileEntityAMSEmitter; +import com.hbm.tileentity.machine.TileEntityAMSLimiter; +import com.hbm.tileentity.machine.TileEntityForceField; +import com.hbm.tileentity.machine.TileEntityMachineDiesel; +import com.hbm.tileentity.machine.TileEntityMachineReactorLarge; +import com.hbm.tileentity.machine.TileEntityMachineReactorSmall; +import com.hbm.tileentity.machine.TileEntityMachineSeleniumEngine; +import com.hbm.tileentity.machine.TileEntityRadioRec; +import com.hbm.tileentity.machine.TileEntityReactorControl; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.tileentity.TileEntity; + +public class GunButtonPacket implements IMessage { + + //true or false, whether or not the key is pressed + boolean state; + //0: [M1] + //1: [M2] + //2: [R] + byte button; + + public GunButtonPacket() { } + + public GunButtonPacket(boolean m1, byte b) { + state = m1; + button = b; + } + + @Override + public void fromBytes(ByteBuf buf) { + state = buf.readBoolean(); + button = buf.readByte(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeBoolean(state); + buf.writeByte(button); + } + + public static class Handler implements IMessageHandler { + + @Override + public IMessage onMessage(GunButtonPacket m, MessageContext ctx) { + + EntityPlayer p = ctx.getServerHandler().playerEntity; + + if(p.getHeldItem() != null && p.getHeldItem().getItem() instanceof ItemGunBase) { + + switch(m.button) { + case 0: ItemGunBase.setIsMouseDown(p.getHeldItem(), m.state); break; + case 1: ItemGunBase.setIsAltDown(p.getHeldItem(), m.state); break; + case 2: ItemGunBase.setIsReloading(p.getHeldItem(), true); break; + } + } + + System.out.println(m.button + ": " + m.state); + + return null; + } + } +} diff --git a/com/hbm/packet/PacketDispatcher.java b/com/hbm/packet/PacketDispatcher.java index 5336f186e..50023ebbb 100644 --- a/com/hbm/packet/PacketDispatcher.java +++ b/com/hbm/packet/PacketDispatcher.java @@ -79,6 +79,8 @@ public class PacketDispatcher { wrapper.registerMessage(TEFFPacket.Handler.class, TEFFPacket.class, i++, Side.CLIENT); //Information packet for the reactor control block wrapper.registerMessage(TEControlPacket.Handler.class, TEControlPacket.class, i++, Side.CLIENT); + //Sends button information for ItemGunBase + wrapper.registerMessage(GunButtonPacket.Handler.class, GunButtonPacket.class, i++, Side.SERVER); } } diff --git a/com/hbm/render/entity/RenderRocket.java b/com/hbm/render/entity/RenderRocket.java index 9999259d4..67a68bb85 100644 --- a/com/hbm/render/entity/RenderRocket.java +++ b/com/hbm/render/entity/RenderRocket.java @@ -4,6 +4,7 @@ import org.lwjgl.opengl.GL11; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; @@ -40,6 +41,10 @@ public class RenderRocket extends Render { bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/models/bullet.png")); } miniNuke.renderAll(0.0625F); + + //renderFlechette(); + //renderDart(); + GL11.glPopMatrix(); } @@ -55,5 +60,216 @@ public class RenderRocket extends Render { return null; } + + private void renderFlechette() { + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + + GL11.glScalef(1F/16F, 1F/16F, 1F/16F); + GL11.glScalef(-1, 1, 1); + + Tessellator tess = Tessellator.instance; + + //back + GL11.glColor3f(0.15F, 0.15F, 0.15F); + tess.startDrawingQuads(); + tess.addVertex(0, 1, -1); + tess.addVertex(0, -1, -1); + tess.addVertex(0, -1, 1); + tess.addVertex(0, 1, 1); + tess.draw(); + + //base + tess.startDrawingQuads(); + tess.addVertex(1, -0.5, -0.5); + tess.addVertex(0, -1, -1); + tess.addVertex(0, 1, -1); + tess.addVertex(1, 0.5, -0.5); + tess.draw(); + + tess.startDrawingQuads(); + tess.addVertex(0, -1, 1); + tess.addVertex(1, -0.5, 0.5); + tess.addVertex(1, 0.5, 0.5); + tess.addVertex(0, 1, 1); + tess.draw(); + + tess.startDrawingQuads(); + tess.addVertex(0, -1, -1); + tess.addVertex(1, -0.5, -0.5); + tess.addVertex(1, -0.5, 0.5); + tess.addVertex(0, -1, 1); + tess.draw(); + + tess.startDrawingQuads(); + tess.addVertex(1, 0.5, -0.5); + tess.addVertex(0, 1, -1); + tess.addVertex(0, 1, 1); + tess.addVertex(1, 0.5, 0.5); + tess.draw(); + + //pin + tess.startDrawing(4); + tess.addVertex(1, -0.5, -0.5); + tess.addVertex(1, 0.5, -0.5); + tess.addVertex(6, 0, 0); + tess.draw(); + + tess.startDrawing(4); + tess.addVertex(1, -0.5, 0.5); + tess.addVertex(6, 0, 0); + tess.addVertex(1, 0.5, 0.5); + tess.draw(); + + tess.startDrawing(4); + tess.addVertex(1, -0.5, -0.5); + tess.addVertex(6, 0, 0); + tess.addVertex(1, -0.5, 0.5); + tess.draw(); + + tess.startDrawing(4); + tess.addVertex(1, 0.5, -0.5); + tess.addVertex(1, 0.5, 0.5); + tess.addVertex(6, 0, 0); + tess.draw(); + + + GL11.glEnable(GL11.GL_TEXTURE_2D); + + GL11.glPopMatrix(); + } + + private void renderDart() { + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDepthMask(false); + + GL11.glScalef(1F/4F, 1F/8F, 1F/8F); + GL11.glScalef(-1, 1, 1); + + Tessellator tess = Tessellator.instance; + + float red = 0.125F; + float green = 0.0F; + float blue = 1.0F; + + //front + tess.startDrawing(4); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(6, 0, 0); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(3, -1, -1); + tess.addVertex(3, 1, -1); + tess.draw(); + + tess.startDrawing(4); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(3, -1, 1); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(6, 0, 0); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(3, 1, 1); + tess.draw(); + + tess.startDrawing(4); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(3, -1, -1); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(6, 0, 0); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(3, -1, 1); + tess.draw(); + + tess.startDrawing(4); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(6, 0, 0); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(3, 1, -1); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(3, 1, 1); + tess.draw(); + + //mid + tess.startDrawing(4); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(6, 0, 0); + tess.addVertex(4, -0.5, -0.5); + tess.addVertex(4, 0.5, -0.5); + tess.draw(); + + tess.startDrawing(4); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(4, -0.5, 0.5); + tess.addVertex(6, 0, 0); + tess.addVertex(4, 0.5, 0.5); + tess.draw(); + + tess.startDrawing(4); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(4, -0.5, -0.5); + tess.addVertex(6, 0, 0); + tess.addVertex(4, -0.5, 0.5); + tess.draw(); + + tess.startDrawing(4); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(6, 0, 0); + tess.addVertex(4, 0.5, -0.5); + tess.addVertex(4, 0.5, 0.5); + tess.draw(); + + //tail + tess.startDrawingQuads(); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(4, 0.5, -0.5); + tess.addVertex(4, 0.5, 0.5); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(0, 0.5, 0.5); + tess.addVertex(0, 0.5, -0.5); + tess.draw(); + + tess.startDrawingQuads(); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(4, -0.5, -0.5); + tess.addVertex(4, -0.5, 0.5); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(0, -0.5, 0.5); + tess.addVertex(0, -0.5, -0.5); + tess.draw(); + + tess.startDrawingQuads(); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(4, -0.5, 0.5); + tess.addVertex(4, 0.5, 0.5); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(0, 0.5, 0.5); + tess.addVertex(0, -0.5, 0.5); + tess.draw(); + + tess.startDrawingQuads(); + tess.setColorRGBA_F(red, green, blue, 1); + tess.addVertex(4, -0.5, -0.5); + tess.addVertex(4, 0.5, -0.5); + tess.setColorRGBA_F(red, green, blue, 0); + tess.addVertex(0, 0.5, -0.5); + tess.addVertex(0, -0.5, -0.5); + tess.draw(); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDepthMask(true); + + GL11.glPopMatrix(); + } } \ No newline at end of file