void Plugin::init() { // Set default behaviours Callback call; /* FIXME: must remember to delete any memory we create here upon server stop */ BlockDefault* defaultblock = new BlockDefault(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onPlace", Function::from_method<BlockDefault, &BlockDefault::onPlace>(defaultblock)); setBlockCallback(BLOCK_STONE, call); setBlockCallback(BLOCK_GRASS, call); setBlockCallback(BLOCK_DIRT, call); setBlockCallback(BLOCK_COBBLESTONE, call); setBlockCallback(BLOCK_WOOD, call); setBlockCallback(BLOCK_LOG, call); setBlockCallback(BLOCK_SOIL, call); setBlockCallback(BLOCK_GLASS, call); /* cloth */ setBlockCallback(BLOCK_RED_CLOTH, call); setBlockCallback(BLOCK_ORANGE_CLOTH, call); setBlockCallback(BLOCK_YELLOW_CLOTH, call); setBlockCallback(BLOCK_LIME_CLOTH, call); setBlockCallback(BLOCK_GREEN_CLOTH, call); setBlockCallback(BLOCK_AQUA_GREEN_CLOTH, call); setBlockCallback(BLOCK_CYAN_CLOTH, call); setBlockCallback(BLOCK_BLUE_CLOTH, call); setBlockCallback(BLOCK_PURPLE_CLOTH, call); setBlockCallback(BLOCK_INDIGO_CLOTH, call); setBlockCallback(BLOCK_VIOLET_CLOTH, call); setBlockCallback(BLOCK_MAGENTA_CLOTH, call); setBlockCallback(BLOCK_PINK_CLOTH, call); setBlockCallback(BLOCK_BLACK_CLOTH, call); setBlockCallback(BLOCK_GRAY_CLOTH, call); setBlockCallback(BLOCK_WHITE_CLOTH, call); /* metals */ setBlockCallback(BLOCK_GOLD_BLOCK, call); setBlockCallback(BLOCK_IRON_BLOCK, call); setBlockCallback(BLOCK_DOUBLE_STEP, call); setBlockCallback(BLOCK_STEP, call); setBlockCallback(BLOCK_BRICK, call); setBlockCallback(BLOCK_BOOKSHELF, call); setBlockCallback(BLOCK_MOSSY_COBBLESTONE, call); setBlockCallback(BLOCK_OBSIDIAN, call); setBlockCallback(BLOCK_MOB_SPAWNER, call); setBlockCallback(BLOCK_DIAMOND_BLOCK, call); setBlockCallback(BLOCK_PUMPKIN, call); setBlockCallback(BLOCK_CLAY, call); setBlockCallback(BLOCK_NETHERSTONE, call); setBlockCallback(BLOCK_LIGHTSTONE, call); setBlockCallback(BLOCK_JACK_O_LANTERN, call); setBlockCallback(BLOCK_JUKEBOX, call); setBlockCallback(BLOCK_FENCE, call); setBlockCallback(BLOCK_GOLD_ORE, call); setBlockCallback(BLOCK_IRON_ORE, call); setBlockCallback(BLOCK_COAL_ORE, call); setBlockCallback(BLOCK_DIAMOND_ORE, call); setBlockCallback(BLOCK_GLOWING_REDSTONE_ORE, call); setBlockCallback(BLOCK_REDSTONE_ORE, call); /* Falling blocks (sand, etc) */ call.reset(); BlockFalling* fallingblock = new BlockFalling(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onPlace", Function::from_method<BlockFalling, &BlockFalling::onPlace>(fallingblock)); call.add("onNeighbourBroken", Function::from_method<BlockFalling, &BlockFalling::onNeighbourBroken>(fallingblock)); call.add("onNeighbourMove", Function::from_method<BlockFalling, &BlockFalling::onNeighbourMove>(fallingblock)); setBlockCallback(BLOCK_SAND, call); setBlockCallback(BLOCK_SLOW_SAND, call); setBlockCallback(BLOCK_GRAVEL, call); /* Torches */ call.reset(); BlockTorch* torchblock = new BlockTorch(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onPlace", Function::from_method<BlockTorch, &BlockTorch::onPlace>(torchblock)); call.add("onNeighbourBroken", Function::from_method<BlockTorch, &BlockTorch::onNeighbourBroken>(torchblock)); call.add("onReplace", Function::from_method<BlockDefault, &BlockDefault::onReplace>(defaultblock)); call.add("onNeighbourMove", Function::from_method<BlockTorch, &BlockTorch::onNeighbourMove>(torchblock)); setBlockCallback(BLOCK_TORCH, call); setBlockCallback(BLOCK_REDSTONE_TORCH_OFF, call); setBlockCallback(BLOCK_REDSTONE_TORCH_ON, call); /* ladders */ call.reset(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onPlace", Function::from_method<BlockDefault, &BlockDefault::onPlace>(defaultblock)); call.add("onNeighbourBroken", Function::from_method<BlockTorch, &BlockTorch::onNeighbourBroken>(torchblock)); setBlockCallback(BLOCK_LADDER, call); /* Plants */ call.reset(); BlockPlant* plantblock = new BlockPlant(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onPlace", Function::from_method<BlockPlant, &BlockPlant::onPlace>(plantblock)); call.add("onNeighbourBroken", Function::from_method<BlockPlant, &BlockPlant::onNeighbourBroken>(plantblock)); call.add("onReplace", Function::from_method<BlockDefault, &BlockDefault::onReplace>(defaultblock)); setBlockCallback(BLOCK_YELLOW_FLOWER, call); setBlockCallback(BLOCK_RED_ROSE, call); setBlockCallback(BLOCK_BROWN_MUSHROOM, call); setBlockCallback(BLOCK_RED_MUSHROOM, call); setBlockCallback(BLOCK_CROPS, call); setBlockCallback(BLOCK_CACTUS, call); setBlockCallback(BLOCK_REED, call); setBlockCallback(BLOCK_SAPLING, call); /* Snow */ call.reset(); BlockSnow* snowblock = new BlockSnow(); call.add("onNeighbourBroken", Function::from_method<BlockSnow, &BlockSnow::onNeighbourBroken>(snowblock)); call.add("onPlace", Function::from_method<BlockDefault, &BlockDefault::onPlace>(defaultblock)); setBlockCallback(BLOCK_SNOW, call); /* Lava and Water */ call.reset(); BlockLiquid* liquidblock = new BlockLiquid(); call.add("onPlace", Function::from_method<BlockLiquid, &BlockLiquid::onPlace>(liquidblock)); call.add("onNeighbourBroken", Function::from_method<BlockLiquid, &BlockLiquid::onNeighbourBroken>(liquidblock)); call.add("onReplace", Function::from_method<BlockLiquid, &BlockLiquid::onReplace>(liquidblock)); setBlockCallback(BLOCK_WATER, call); setBlockCallback(BLOCK_STATIONARY_WATER, call); setBlockCallback(BLOCK_LAVA, call); setBlockCallback(BLOCK_STATIONARY_LAVA, call); setBlockCallback(ITEM_WATER_BUCKET, call); setBlockCallback(ITEM_LAVA_BUCKET, call); /* Fire */ call.reset(); BlockFire* fireblock = new BlockFire(); call.add("onPlace", Function::from_method<BlockFire, &BlockFire::onPlace>(fireblock)); setBlockCallback(BLOCK_FIRE, call); setBlockCallback(ITEM_FLINT_AND_STEEL, call); /* Stairs */ call.reset(); BlockStair* stairblock = new BlockStair(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onPlace", Function::from_method<BlockDefault, &BlockDefault::onPlace>(defaultblock)); call.add("onNeighbourBroken", Function::from_method<BlockStair, &BlockStair::onNeighbourBroken>(stairblock)); setBlockCallback(BLOCK_WOODEN_STAIRS, call); setBlockCallback(BLOCK_COBBLESTONE_STAIRS, call); /* TNT */ call.reset(); call.add("onPlace", Function::from_method<BlockDefault, &BlockDefault::onPlace>(defaultblock)); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); /* TODO: Currently works like glass. Explosion is not implemented yet. */ setBlockCallback(BLOCK_TNT, call); /* Workbench and furnace */ call.reset(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onPlace", Function::from_method<BlockDefault, &BlockDefault::onPlace>(defaultblock)); call.add("onReplace", Function::from_method<BlockDefault, &BlockDefault::onReplace>(defaultblock)); setBlockCallback(BLOCK_WORKBENCH, call); setBlockCallback(BLOCK_FURNACE, call); setBlockCallback(BLOCK_BURNING_FURNACE, call); /* Chests */ call.reset(); BlockChest* chestblock = new BlockChest(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onPlace", Function::from_method<BlockChest, &BlockChest::onPlace>(chestblock)); call.add("onStartedDigging", Function::from_method<BlockChest, &BlockChest::onStartedDigging>(chestblock)); call.add("onReplace", Function::from_method<BlockChest, &BlockChest::onReplace>(chestblock)); setBlockCallback(BLOCK_CHEST, call); /* Doors */ call.reset(); BlockDoor* doorblock = new BlockDoor(); call.add("onStartedDigging", Function::from_method<BlockDoor, &BlockDoor::onStartedDigging>(doorblock)); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onPlace", Function::from_method<BlockDoor, &BlockDoor::onPlace>(doorblock)); setBlockCallback(BLOCK_WOODEN_DOOR, call); setBlockCallback(BLOCK_IRON_DOOR, call); setBlockCallback(ITEM_WOODEN_DOOR, call); setBlockCallback(ITEM_IRON_DOOR, call); /* leaves */ call.reset(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); setBlockCallback(BLOCK_LEAVES, call); /* signs */ call.reset(); BlockSign* signblock = new BlockSign(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onNeighbourBroken", Function::from_method<BlockTorch, &BlockTorch::onNeighbourBroken>(torchblock)); call.add("onPlace", Function::from_method<BlockSign, &BlockSign::onPlace>(signblock)); setBlockCallback(BLOCK_WALL_SIGN, call); setBlockCallback(BLOCK_SIGN_POST, call); setBlockCallback(ITEM_SIGN, call); /* minecart tracks */ call.reset(); BlockTracks* tracksblock = new BlockTracks(); call.add("onBroken", Function::from_method<BlockDefault, &BlockDefault::onBroken>(defaultblock)); call.add("onPlace", Function::from_method<BlockTracks, &BlockTracks::onPlace>(tracksblock)); call.add("onNeighbourBroken", Function::from_method<BlockTracks, &BlockTracks::onNeighbourBroken>(tracksblock)); // call.add("onNeighbourPlace", Function::from_method<BlockTracks, &BlockTracks::onNeighbourPlace>(tracksblock)); // call.add("onNeighbourMove", Function::from_method<BlockTracks, &BlockTracks::onNeighbourMove>(tracksblock)); setBlockCallback(BLOCK_MINECART_TRACKS, call); /* TODO: Unimplemented */ /* BLOCK_SPONGE */ /* BLOCK_REDSTONE_WIRE */ /* BLOCK_PORTAL */ /* BLOCK_LEVER, BLOCK_STONE_BUTTON */ /* BLOCK_WOODEN_PRESSURE_PLATE, BLOCK_STONE_PRESSURE_PLATE */ /* BLOCK_ICE */ /* BLOCK_SNOW_BLOCK */ }