You are not logged in.

  • Login

[Bukkit-Plugin] Berechnung schlägt fehl

Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

Sebi_Zocer

User / Kunde

  • "Sebi_Zocer" is male
  • "Sebi_Zocer" started this thread

Posts: 229

Location: Privat

Occupation: Privat

  • Send private message

1

Sunday, October 28th 2018, 5:47pm

Berechnung schlägt fehl

Hi Leude,
Ich erklär mal kurz, was ich hab:

- Region
---Coreblock (X und Z Koordinate)
---Range(8)

- SpaceBetweenRegions(3)

- Spawnbereich
--- Von Koordinate 1 bis zu Koordinate 2

Ich will nun folgendes:
ich will eine Region setzen, dessen Range(8) + SpaceBetweenRegions(3) nicht den Spawn überlappen.
Leider resultiert dieser Code darin, dass sich die beiden überlappen müssen:

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
	public static BaseSetResult checkBaseSet(int CoreX, int CoreZ){
		for(Base b : Bases){
			if(!(checkBaseSetX(CoreX))){
				if(!(checkBaseSetZ(CoreZ))){
					return new BaseSetResult(false, BaseDenyReason.Base, b);
				}
			}
		}
		
		Location loc1 = LocationManager.getLocation("spawn.1");
		Location loc2 = LocationManager.getLocation("spawn.2");
		
		int x1 = 0;
		int x2 = 0;
		int z1 = 0;
		int z2 = 0;
		if(loc1.getBlockX() < loc2.getBlockX()){
			x1 = loc1.getBlockX();
			x2 = loc2.getBlockX();
		} else {
			x1 = loc2.getBlockX();
			x2 = loc1.getBlockX();
		}
		if(loc1.getBlockZ() < loc2.getBlockZ()){
			z1 = loc1.getBlockZ();
			z2 = loc2.getBlockZ();
		} else {
			z1 = loc2.getBlockZ();
			z2 = loc1.getBlockZ();
		}
		
		int range = ConfigManager.getConfigManager("config").getYaml().getInt("MaxBaseRange");
		int space = ConfigManager.getConfigManager("config").getYaml().getInt("SpaceBetweenBases");
		int X1 = CoreX - range;
		int X2 = CoreX + range;
		int Z1 = CoreZ - range;
		int Z2 = CoreZ + range;
		
		if(x2 + space < X1 || X2 + space < x1){
			if(z2 + space < Z1 || Z2 + space < z1){
				return new BaseSetResult(false, BaseDenyReason.Spawn, null);
			}
		}
		
		return new BaseSetResult(true, null, null);
	}


Ich hab leider keine Idee, was da falsch läuft und wäre sehr dankbar, wenn mir jemand helfen kann.

LG Sebi

This post has been edited 1 times, last edit by "Sebi_Zocer" (Oct 30th 2018, 7:25am)


MortalMatty

User / Kunde

  • "MortalMatty" is male

Posts: 26

Thanks: 3

  • Send private message

2

Sunday, October 28th 2018, 11:42pm

Wenn ich mir den Code so anschaue sollte es eigentlich nur daran liegen, dass du das Retourn-Statement falsch gesetzt hast.
Im folgenden Part solltest du true returnen, da sich der Bereich ja eben genau NICHT im Spawn befindet.

Java source code

1
2
3
4
5
6
7
8
9
10
		int X1 = CoreX - range;
		int X2 = CoreX + range;
		int Z1 = CoreZ - range;
		int Z2 = CoreZ + range;
		
		if(x2 + space < X1 || X2 + space < x1){
			if(z2 + space < Z1 || Z2 + space < z1){
				return new BaseSetResult(false, BaseDenyReason.Spawn, null);
		}
		}

Außerdem musst du ganz zum Schluss das return new BaseSetResult(true, null, null); zu einem false-return umschreiben, da sich der Spawn sonst mit dem gewünschten Bereich überlapt.


Hoffe das es daran lag :)
4e 69 65 20 47 6c c3 bc 63 6b 20 3a 28

Sebi_Zocer

User / Kunde

  • "Sebi_Zocer" is male
  • "Sebi_Zocer" started this thread

Posts: 229

Location: Privat

Occupation: Privat

  • Send private message

3

Monday, October 29th 2018, 10:16am

Nop

Wenn die Bereiche überlappen ist es false

xtrumb

User / Kunde

  • "xtrumb" is male

Posts: 2,295

Location: hier

Occupation: Fachinformatiker für Systemintegration

Thanks: 16

  • Send private message

4

Tuesday, October 30th 2018, 12:57pm

Ich würde dir gerne helfen, aber ich blicke nicht durch den Code. Könntest du mir die verschiedenen Variabeln mal erklären?

ist das kleine x1 der min. Punkt und x2 der max?

Wieso fragst du großes X1 und kleines ab und fügst das nicht zusammmen?

?( 8|


EDIT: Mal so eine blöde frage, musst du am ende nicht auch noch space min nehmen um die andere richtung abzufragen?
Mit freundlichen Grüßen
TrueMB

Dienstleistungs Service
Unser Csgo Team

This post has been edited 1 times, last edit by "xtrumb" (Oct 30th 2018, 1:39pm)


Sebi_Zocer

User / Kunde

  • "Sebi_Zocer" is male
  • "Sebi_Zocer" started this thread

Posts: 229

Location: Privat

Occupation: Privat

  • Send private message

5

Tuesday, October 30th 2018, 5:53pm

Ich habs nun anders gelöst, nämlich so:

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
	public static boolean checkBaseSetSpawn(int CoreX, int CoreZ){
		ConfigManager cfgg = ConfigManager.getConfigManager("config");
		int space = cfgg.getYaml().getInt("SpaceBetweenBases");
		int range = cfgg.getYaml().getInt("MaxBaseRange");
		int distance = space + range;
		Location loc1 = LocationManager.getLocation("spawn.1");
		Location loc2 = LocationManager.getLocation("spawn.2");
		
		//spawn calculating
		
		int spawnx1 = 0;
		int spawnx2 = 0;
		int spawnz1 = 0;
		int spawnz2 = 0;
		if(loc1.getBlockX() < loc2.getBlockX()){
			spawnx1 = loc1.getBlockX();
			spawnx2 = loc2.getBlockX();
		} else {
			spawnx1 = loc2.getBlockX();
			spawnx2 = loc1.getBlockX();
		}
		if(loc1.getBlockZ() < loc2.getBlockZ()){
			spawnz1 = loc1.getBlockZ();
			spawnz2 = loc2.getBlockZ();
		} else {
			spawnz1 = loc2.getBlockZ();
			spawnz2 = loc1.getBlockZ();
		}
		
		//combinding spawn coords with core-blocks
		
		int x1 = 0;
		int x2 = 0;
		int x3 = 0;
		int x4 = 0;
		int z1 = 0;
		int z2 = 0;
		int z3 = 0;
		int z4 = 0;
		
		if(CoreX < spawnx1){
			x1 = CoreX;
			x2 = spawnx1;
		} else {
			x1 = spawnx1;
			x2 = CoreX;
		}
		if(CoreZ < spawnz1){
			z1 = CoreZ;
			z2 = spawnz1;
		} else {
			z1 = spawnz1;
			z2 = CoreZ;
		}
		
		if(CoreX < spawnx2){
			x3 = CoreX;
			x4 = spawnx2;
		} else {
			x3 = spawnx2;
			x4 = CoreX;
		}
		if(CoreZ < spawnz2){
			z3 = CoreZ;
			z4 = spawnz2;
		} else {
			z3 = spawnz2;
			z4 = CoreZ;
		}
		
		//checking regions
		
		if(!(x1 + distance < x2)){
			if(!(z1 + distance < z2)){
				if(!(x3 + distance < x4)){
					if(!(z3 + distance < z4)){
						return false;
					}
				}
			}
		}
		return true;
	}


@xtrumb Ich erklärs dir mal an diesem Code:

"loc1" und "loc2" sind die gesetzen Spawnlocations. Alle Blöcke zwischen ihnen sind der Spawn

in "spawn calculating" werden die "x" und die "z" Koordinate vom Spawn sortiert. "spawnx1" ist die kleinste "x"-Koordinate vom Spawn und "spawnz1" die "z"-Koordinate.

Nun werden in "combinding spawn coords with core-blocks" wieder die "x" und die "z" Koordinate sortiert. Wie genau weiß ich jetzt auch nicht, hab da aus dem Bauchgefühl gehandelt :rofl:

Zuletzt werden in "checking regions" die Koordinaten getestet und errechnet, ob sich die Regionen überlappen. Wenn sie es tun, sind alle Abfragen true und es wird false returnt.

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net

Similar threads