Exemple #1
0
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 */
}