/*
 * This file is part of Sponge, licensed under the MIT License (MIT).
 *
 * Copyright (c) SpongePowered <https://www.spongepowered.org>
 * Copyright (c) contributors
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package org.spongepowered.server.mixin.core.world;

import net.minecraft.entity.Entity;
import net.minecraft.network.Packet;
import net.minecraft.profiler.Profiler;
import net.minecraft.server.management.PlayerList;
import net.minecraft.world.Explosion;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.WorldServer;
import net.minecraft.world.storage.ISaveHandler;
import net.minecraft.world.storage.WorldInfo;
import org.spongepowered.api.event.SpongeEventFactory;
import org.spongepowered.api.event.world.ExplosionEvent;
import org.spongepowered.api.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import org.spongepowered.common.SpongeImpl;
import org.spongepowered.common.interfaces.world.IMixinWorldInfo;
import org.spongepowered.server.interfaces.IMixinExplosion;

@Mixin(WorldServer.class)
public abstract class MixinWorldServer extends net.minecraft.world.World {

    private MixinWorldServer(ISaveHandler saveHandlerIn, WorldInfo info, WorldProvider providerIn, Profiler profilerIn, boolean client) {
        super(saveHandlerIn, info, providerIn, profilerIn, client);
    }

    // Prevent wrong weather changes getting sent to players in other (unaffected) dimensions
    // This causes "phantom rain" on the client, sunny and rainy weather at the same time
    @Redirect(method = "updateWeather", require = 4, at = @At(value = "INVOKE",
            target = "Lnet/minecraft/server/management/PlayerList;sendPacketToAllPlayers(Lnet/minecraft/network/Packet;)V"))
    private void onSendWeatherPacket(PlayerList manager, Packet<?> packet) {
        manager.sendPacketToAllPlayersInDimension(packet, this.provider.getDimensionType().getId());
    }

    public Integer getDimensionId() {
        return ((IMixinWorldInfo) this.worldInfo).getDimensionId();
    }

    public void setDimensionId(int dimensionId) {
        ((IMixinWorldInfo) this.worldInfo).setDimensionId(dimensionId);
    }

}

@@ -1297,44 +1297,8 @@
 d;%0A%0A
-import net.minecraft.entity.Entity;%0A
 impo
@@ -1448,25 +1448,63 @@
 t.world.
-Explosion
+DimensionType;%0Aimport net.minecraft.world.World
 ;%0Aimport
@@ -1678,162 +1678,8 @@
 fo;%0A
-import org.spongepowered.api.event.SpongeEventFactory;%0Aimport org.spongepowered.api.event.world.ExplosionEvent;%0Aimport org.spongepowered.api.world.World;%0A
 impo
@@ -1769,61 +1769,8 @@
 At;%0A
-import org.spongepowered.asm.mixin.injection.Inject;%0A
 impo
@@ -1849,297 +1849,47 @@
 red.
-asm.mixin.injection.callback.CallbackInfoReturnable;%0Aimport org.spongepowered.asm.mixin.injection.callback.LocalCapture;%0Aimport org.spongepowered.common.SpongeImpl;%0Aimport org.spongepowered.common.interfaces.world.IMixinWorldInfo;%0Aimport org.spongepowered.server.interfaces.IMixinExplosion
+common.interfaces.world.IMixinWorldInfo
 ;%0A%0A@
@@ -1960,36 +1960,16 @@
 extends 
-net.minecraft.world.
 World %7B%0A
@@ -2178,24 +2178,253 @@
 nt);%0A    %7D%0A%0A
+    @Redirect(method = %22updateWeather%22, at = @At(value = %22INVOKE%22, target = %22Lnet/minecraft/world/DimensionType;getId()I%22))%0A    private int onGetDimensionIdForWeather(DimensionType type) %7B%0A        return getDimensionId();%0A    %7D%0A%0A
     // Preve
@@ -2939,22 +2939,8 @@
 et, 
-this.provider.
 getD
@@ -2951,18 +2951,8 @@
 sion
-Type().get
 Id()

Fix weather changes in custom worlds