@Override
    public void tick(VGame vg, VObject vo) {
        vo.s("hp", vo.gi("hp") - 1);
        vg.vl.open_map(2, vo.gi("x"), vo.gi("y"), vo.gi("z"));
        if (vo.gi("hp") <= 0) {
            vg.addSpray(vo.type.gi("boom_type"), new VPoint(vo.gi("x"), vo.gi("y"), vo.gi("z")));
            if (vo.type.g("pit").equals("yes")) {
                vg.vl.pit(vo.gi("x"), vo.gi("y"), vo.gi("z"));
            }
            if (vo.type.g("crater").equals("yes")) {
                vg.vl.crater(vo.gi("x"), vo.gi("y"), vo.gi("z"));
            }
            vo.remove();
        }
        if (vo.type.g("model").equals("voxel")) {
            if (r.nextInt(5) == 0 && vo.type.g("trace").equals("yes")) {

                vg.addSpray(vo.type.gi("trace_type"), new VPoint(vo.gi("x"), vo.gi("y"), vo.gi("z")));
            }
            for (VObject obj : vg.getObjects(new VPoint(vo.gi("x"), vo.gi("y"), vo.gi("z")), 20, "#tick")) {
                if (obj == vo) {
                    continue;
                }
                if (vo.gi("ow") != obj.gi("ow")) {
                    obj.vp.call(vg, obj, "hit", vo.g("pw"), vo.type.g("type"));
                    vo.remove();
                }

            }
            vo.s("x", vo.gi("x") + vo.gi("vx"));
            vo.s("y", vo.gi("y") + vo.gi("vy"));
            vo.s("z", vo.gd("z") + vo.gd("vz"));
            vo.s("ay", Math.atan2(vo.gd("vz"), vo.type.gd("v")));
            vo.s("vz", vo.gd("vz") + vo.type.gd("g"));
        }
    }