• Chào bạn, hãy đăng ký hoặc đăng nhập để tham gia cùng bọn mình và sử dụng được đầy đủ chức năng của diễn đàn :).
Le Thinh

Hướng dẫn Multiblock Implementation - Xài thuật này get center của multiblock tính ở ngoài được vào code sai

Le Thinh

DEVELOPER
THÀNH VIÊN
Tham gia
01/09/2017
Bài viết
38
Mình đang implement Multiblock trong Bukkit (hoặc Spigot, gì cũng được), nhưng thuật này của mình sao tính ở bên ngoài (tính trên giấy và máy tính) thì nó ra được cái center nhưng vào trong code lại không chính xác. Đây là code: https://github.com/letruongthinh/Ma...mantle/multiblock/MultiBlockTracker.java#L100

Thuật để get center mình để ở trong method getCenter

Đây là cách hoạt động:
- Center (cách đều mỗi khoảng đến mỗi bức tường trong Multiblock, ko check ở trên và dưới) được tính bằng cách cho paremeter bất kì 1 block ở trong Multiblock, chỉ tính trên mặt phẳng X - Z, còn Y thì ko check.
- Gọi vị trí expand hiện tại của X ở bên trái (âm) là x1, bên phải (dương) là x2
- Ví dụ block mình cần check đang ở trên trục X (trục tọa độ), ở vị trí [-1, 0] (cái ở đầu là X, đằng sau là Z), mình sẽ mở rộng cái trục (trong code lol), nếu block tiếp theo trống (air, hoặc ko là bức tường) thì sẽ expand
- Nếu x1 - x2 (hoặc x2 - x1) lớn hơn 1 thì vị trí X cái
Location của block đã cho trong parameter sẽ trừ 1 (hoặc cộng 1) theo hướng X. Và x1 sẽ bị trừ đi 1 và x2 sẽ dc cộng thêm 1 (nếu x1 - x2 > 1), và ngược lại.
- Lặp lại (bạn có thể vẽ 1 cái trục tọa độ r check, nếu multiblock là 3x3 thì chỉ cần 2 lần là dừng, 5x5 thì 4 lần)

Những điều trên có vẻ chính xác nhưng vào code là ..., ko hoạt động. Mấy thánh nào cao tuổi nhìu kinh nghiêm giúp em vs ạ, em ms học trục tọa độ năm ngoái nên chưa rành lắm, có thể đã tính sai chỗ nào đó :v

@anhcraft @Banbeucmas @Quang1999
 
Mình đang implement Multiblock trong Bukkit (hoặc spigot Spigot, gì cũng được), nhưng thuật này của mình sao tính ở bên ngoài (tính trên giấy và máy tính) thì nó ra được cái center nhưng vào trong code lại không chính xác. Đây là code: https://github.com/letruongthinh/Ma...mantle/multiblock/MultiBlockTracker.java#L100

Thuật để get center mình để ở trong method getCenter

Đây là cách hoạt động:
- Center (cách đều mỗi khoảng đến mỗi bức tường trong Multiblock, ko check ở trên và dưới) được tính bằng cách cho paremeter bất kì 1 block ở trong Multiblock, chỉ tính trên mặt phẳng X - Z, còn Y thì ko check.
- Ví dụ block mình cần check đâng ở trên trục X (trục tọa độ), đang ở vị trị [-1, 0] (cái ở đầu là X, đằng sau là Z), mình sẽ mở rộng cái trục (trong code lol), vì X là -1 nên block tiếp theo là bức tường nên không expand, nên sẽ expand qua bên phải (dương)
- Gọi vị trí expand hiện tại của X ở bên trái (âm) là x1, bên phải (dương) là x2
- Nếu x1 - x2 (hoặc x2 - x1) lớn hơn 1 thì cái Location của block đã cho trong parameter sẽ trừ 1 (hoặc cộng 1) theo hướng X. Và x1 sẽ bị trừ đi 1 và x2 sẽ dc cộng thêm 1 (nếu x1 - x2 > 1), và ngược lại.
- Lặp lại (bạn có thể vẽ 1 cái trục tọa độ r check, nếu multiblock là 3x3 thì chỉ cần 2 lần là dừng, 5x5 thì 4 lần)

Những điều trên có vẻ chính xác nhưng vào code là ..., ko hoạt động. Mấy thánh nào cao tuổi nhìu kinh nghiêm giúp em vs ạ, em ms học trục tọa độ năm ngoái nên chưa rành lắm, có thể đã tính sai chỗ nào đó :v

@anhcraft @Banbeucmas @Quang1999
#getType() và null check cho đống block ổn hơn đấy.
Material.AIR cũng được tính là 1 block mà
 
Mình đang implement Multiblock trong Bukkit (hoặc Spigot, gì cũng được), nhưng thuật này của mình sao tính ở bên ngoài (tính trên giấy và máy tính) thì nó ra được cái center nhưng vào trong code lại không chính xác. Đây là code: https://github.com/letruongthinh/Ma...mantle/multiblock/MultiBlockTracker.java#L100

Thuật để get center mình để ở trong method getCenter

Đây là cách hoạt động:
- Center (cách đều mỗi khoảng đến mỗi bức tường trong Multiblock, ko check ở trên và dưới) được tính bằng cách cho paremeter bất kì 1 block ở trong Multiblock, chỉ tính trên mặt phẳng X - Z, còn Y thì ko check.
- Gọi vị trí expand hiện tại của X ở bên trái (âm) là x1, bên phải (dương) là x2
- Ví dụ block mình cần check đang ở trên trục X (trục tọa độ), ở vị trí [-1, 0] (cái ở đầu là X, đằng sau là Z), mình sẽ mở rộng cái trục (trong code lol), nếu block tiếp theo trống (air, hoặc ko là bức tường) thì sẽ expand
- Nếu x1 - x2 (hoặc x2 - x1) lớn hơn 1 thì vị trí X cái
Location của block đã cho trong parameter sẽ trừ 1 (hoặc cộng 1) theo hướng X. Và x1 sẽ bị trừ đi 1 và x2 sẽ dc cộng thêm 1 (nếu x1 - x2 > 1), và ngược lại.
- Lặp lại (bạn có thể vẽ 1 cái trục tọa độ r check, nếu multiblock là 3x3 thì chỉ cần 2 lần là dừng, 5x5 thì 4 lần)

Những điều trên có vẻ chính xác nhưng vào code là ..., ko hoạt động. Mấy thánh nào cao tuổi nhìu kinh nghiêm giúp em vs ạ, em ms học trục tọa độ năm ngoái nên chưa rành lắm, có thể đã tính sai chỗ nào đó :v

@anhcraft @Banbeucmas @Quang1999
@_@ LOL !
 
nghĩa là có 1 hình hộp (cuboid), đã biết kích cỡ và vị trí của 1 block.
giờ cần tìm block trung tâm cuboid do?
 
nghĩa là có 1 hình hộp (cuboid), đã biết kích cỡ và vị trí của 1 block.
giờ cần tìm block trung tâm cuboid do?
yea có nói r mà bác :v
*****Nội dung được bổ sung thêm*****
mà cái cách tìm center ở ngoài tính đúng ở code tính sai :v
 
yea có nói r mà bác :v
*****Nội dung được bổ sung thêm*****
mà cái cách tìm center ở ngoài tính đúng ở code tính sai :v
t ko hiểu lam. Nếu như có 1 hình hộp thì it ra cũng da biet
- Vị trí trung tâm và kích cỡ
- Vị trí 2 góc
Chứ co vi tri block ngau nhien thi s biet cai hop do the nao
 
t ko hiểu lam. Nếu như có 1 hình hộp thì it ra cũng da biet
- Vị trí trung tâm và kích cỡ
- Vị trí 2 góc
Chứ co vi tri block ngau nhien thi s biet cai hop do the nao
đây là 3D lol, nếu cứ check neighbor khi đặt từng block sẽ rất phức tạp, và đây là multiblock nên cần phải có center ms check dc xem có valid hay k
*****Nội dung được bổ sung thêm*****
Đây là hình minh họa cách tính :v
*****Nội dung được bổ sung thêm*****
btw cái đó là check trên 2D vì tìm center chỉ tìm trên mặt phẳng X - Z
 

Đính kèm

  • 0 bytes · Lượt xem: 11
đây là 3D lol, nếu cứ check neighbor khi đặt từng block sẽ rất phức tạp, và đây là multiblock nên cần phải có center ms check dc xem có valid hay k
*****Nội dung được bổ sung thêm*****
Đây là hình minh họa cách tính :v
*****Nội dung được bổ sung thêm*****
btw cái đó là check trên 2D vì tìm center chỉ tìm trên mặt phẳng X - Z

đo khoảng cách 2 vị trí trên trục x rồi chia nửa
làm vậy vs 2 trục còn lại, miễn là x2 >= x1,....
ngoài ra t cũng có cách khác la đo khoảng cách 2 vị trí bằng hàm #distance của Bukkit, chia nửa rồi dùng vector
 
đo khoảng cách 2 vị trí trên trục x rồi chia nửa
làm vậy vs 2 trục còn lại, miễn là x2 >= x1,....
ngoài ra t cũng có cách khác la đo khoảng cách 2 vị trí bằng hàm #distance của Bukkit, chia nửa rồi dùng vector
:lul: sao đo dc, nếu đo phải check từng block rất mệt
*****Nội dung được bổ sung thêm*****
check từng block là check neighbor tho
 
:lul: sao đo dc, nếu đo phải check từng block rất mệt
*****Nội dung được bổ sung thêm*****
check từng block là check neighbor tho
check mỗi lần (+1,+1). gặp BLOCK AIR thì dừng
check mỗi lần (-1,-1). gặp BLOCK AIR thì dừng
sau do rui lay vector tu 2 vi tri do, rui multiple voi -2
 
check mỗi lần (+1,+1). gặp BLOCK AIR thì dừng
check mỗi lần (-1,-1). gặp BLOCK AIR thì dừng
sau do rui lay vector tu 2 vi tri do, rui multiple voi -2
như vậy à:

Mã:
int xLeft = 1, xRight = 1;
        int zLeft = 1, zRight = 1;
        Location from = inside, to = inside;

        for (int i = 0; i < size; ++i) {
            if (inside.add(-xLeft, 0, -zLeft).getBlock().isEmpty()) {
                from = inside.add(-xLeft, 0, -zLeft);
                ++xLeft;
                ++zLeft;
            }

            if (inside.add(xRight, 0, zRight).getBlock().isEmpty()) {
                to = inside.add(xRight, 0, zRight);
                ++xRight;
                ++zRight;
            }

            inside = from.add(to).multiply(-2);
        }

        return inside;
 
như vậy à:

Mã:
int xLeft = 1, xRight = 1;
        int zLeft = 1, zRight = 1;
        Location from = inside, to = inside;

        for (int i = 0; i < size; ++i) {
            if (inside.add(-xLeft, 0, -zLeft).getBlock().isEmpty()) {
                from = inside.add(-xLeft, 0, -zLeft);
                ++xLeft;
                ++zLeft;
            }

            if (inside.add(xRight, 0, zRight).getBlock().isEmpty()) {
                to = inside.add(xRight, 0, zRight);
                ++xRight;
                ++zRight;
            }

            inside = from.add(to).multiply(-2);
        }

        return inside;
cái add() no se override len cai cu
vi the call 2 lan nhu vay la code sai r
clone() r check hc dat vao chung 1 bien
 
cái add() no se override len cai cu
vi the call 2 lan nhu vay la code sai r
clone() r check hc dat vao chung 1 bien
Như thế này?

Mã:
int xLeft = 1, xRight = 1;
        int zLeft = 1, zRight = 1;
        Location from = inside, to = inside;

        for (int i = 0; i < size; ++i) {
            if (new Location(inside.getWorld(), inside.getX(), inside.getY(), inside.getZ()).subtract(xLeft, 0, zLeft)
                    .getBlock().isEmpty()) {
                from = inside.subtract(xLeft, 0, zLeft);
                ++xLeft;
                ++zLeft;
            }

            if (new Location(inside.getWorld(), inside.getX(), inside.getY(), inside.getZ()).add(xRight, 0, zRight)
                    .getBlock().isEmpty()) {
                to = inside.add(xRight, 0, zRight);
                ++xRight;
                ++zRight;
            }

            inside = from.add(to).multiply(-2);
        }

        return inside;
*****Nội dung được bổ sung thêm*****
Oh shit, bt sao code k hoạt động r. Do xài cái Location#add 2 lần nên đã sửa thành stimulate và đã get dc center, thanks bác :D
@Banbeucmas Close thread nào :v
 
Back
Top Bottom