1 /* 2 * Copyright (c) 2017-2019 sel-project 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a copy 5 * of this software and associated documentation files (the "Software"), to deal 6 * in the Software without restriction, including without limitation the rights 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 * copies of the Software, and to permit persons to whom the Software is 9 * furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in all 12 * copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 * SOFTWARE. 21 * 22 */ 23 /** 24 * Copyright: Copyright (c) 2017-2019 sel-project 25 * License: MIT 26 * Authors: Kripth 27 * Source: $(HTTP github.com/sel-project/selery/source/selery/entity/noai.d, selery/entity/noai.d) 28 */ 29 module selery.entity.noai; 30 31 import std.conv : to; 32 33 import selery.about; 34 import selery.block.block; 35 import selery.entity.entity; 36 import selery.entity.interfaces; 37 import selery.item.slot : Slot; 38 import selery.math.vector : BlockPosition, EntityPosition, entityPosition; 39 import selery.player.player : Player; 40 import selery.util.util : call; 41 import selery.world.world : World; 42 43 static import sul.entities; 44 45 class ItemEntity : Entity, Collectable { 46 47 public static immutable uint LIFETIME = 5 * 60 * 20; 48 49 public static immutable uint PICKUP_DELAY = 1 * 20; 50 51 public static immutable float WIDTH = .25; 52 53 public static immutable float HEIGHT = .25; 54 55 private Slot n_item; 56 public bool pickUp = true; 57 public uint delay = PICKUP_DELAY; 58 59 public this(World world, EntityPosition position, EntityPosition motion, Slot item) { 60 super(world, position); 61 assert(!item.empty, "Can't drop an empty slot!"); 62 this.n_data = 1; 63 this.m_motion = motion; 64 this.n_item = item; 65 static if(supportedJavaProtocols.length) { 66 import selery.player.java : JavaPlayerImpl; 67 foreach(immutable i ; SupportedJavaProtocols) { 68 mixin("this.metadata.java" ~ to!string(i) ~ ".item = JavaPlayerImpl!" ~ to!string(i) ~ ".toSlot(item);"); 69 } 70 } 71 this.setSize(WIDTH, HEIGHT); 72 this.acceleration = .05; 73 this.terminal_velocity = 100; 74 this.drag = .99; 75 } 76 77 public override pure nothrow @property @safe @nogc sul.entities.Entity data() { 78 return Entities.droppedItem; 79 } 80 81 public override void tick() { 82 super.tick(); 83 if(this.ticks > LIFETIME) { 84 this.despawn(); 85 } 86 if(this.delay > 0) { 87 this.delay--; 88 } else { 89 // check for pickup 90 /+foreach(Entity entity ; this.watchlist) { 91 if(cast(Collector)entity && this.box.grow(.25, .25).intersects(entity.box)) { 92 if((cast(Collector)entity).onCollect(this)) { 93 this.viewers!Player.call!"sendPickupItem"(entity, this); 94 this.despawn(); 95 return; 96 } 97 } 98 }+/ 99 } 100 101 //TODO check if it's into a block 102 103 //this.doPhysic(); 104 105 } 106 107 public pure nothrow @property @safe @nogc Slot item() { 108 return this.n_item; 109 } 110 111 alias slot = item; 112 113 public override @trusted bool shouldSee(Entity entity) { 114 return cast(Collector)entity || (cast(ItemEntity)entity && this.item.item == (cast(ItemEntity)entity).item.item); 115 } 116 117 } 118 119 final class Lightning : Entity { 120 121 public this(World world, EntityPosition position) { 122 super(world, position); 123 } 124 125 public override pure nothrow @property @safe @nogc sul.entities.Entity data() { 126 return Entities.lightning; 127 } 128 129 public override void tick() { 130 super.tick(); 131 if(this.ticks == 4) { 132 //TODO fire 133 //TODO strike the entities 134 super.despawn(); 135 } 136 } 137 138 } 139 140 final class Painting : Entity { 141 142 public static immutable string KEBAB = "Kebab"; 143 public static immutable string AZTEC = "Aztec"; 144 public static immutable string ALBAN = "Alban"; 145 public static immutable string AZTEC2 = "Aztec2"; 146 public static immutable string BOMB = "Bomb"; 147 public static immutable string PLANT = "Plant"; 148 public static immutable string WASTELAND = "Wasteland"; 149 public static immutable string POOL = "Pool"; 150 public static immutable string COURBET = "Courbet"; 151 public static immutable string SEA = "Sea"; 152 public static immutable string SUNSET = "Sunset"; 153 public static immutable string CREEBET = "Creebet"; 154 public static immutable string WANDERER = "Wanderer"; 155 public static immutable string GRAHAM = "Graham"; 156 public static immutable string MATCH = "Match"; 157 public static immutable string BUST = "Bust"; 158 public static immutable string STAGE = "Stage"; 159 public static immutable string VOID = "Void"; 160 public static immutable string SKULL_AND_ROSES = "SkullAndRoses"; 161 public static immutable string WITHER = "Wither"; 162 public static immutable string FIGHTERS = "Fighters"; 163 public static immutable string POINTER = "Pointer"; 164 public static immutable string PIGSCENE = "PigScene"; 165 public static immutable string BURNINGSKULL = "BurningSkull"; 166 public static immutable string SKELETON = "Skeleton"; 167 public static immutable string DONKEYKONG = "DonkeyKong"; 168 169 public bool ticking = false; 170 171 private string n_title; 172 private uint n_direction; 173 174 public this(World world, BlockPosition position, string title, uint direction) { 175 super(world, position.entityPosition); 176 this.n_title = title; 177 this.n_direction = direction; 178 } 179 180 public override pure nothrow @property @safe @nogc sul.entities.Entity data() { 181 return Entities.painting; 182 } 183 184 public pure nothrow @property @safe @nogc string title() { 185 return this.n_title; 186 } 187 188 public pure nothrow @property @safe @nogc uint direction() { 189 return this.n_direction; 190 } 191 192 }