mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-02-21 20:18:14 +07:00
Added spells panel with buttons
This commit is contained in:
parent
e7a0228de4
commit
45b67e6cb8
@ -8,38 +8,66 @@ public enum CharacterClass {
|
||||
AMAZON ("am", 0) {{
|
||||
name = 4011;
|
||||
description = 5128;
|
||||
spellsBackground = "skltree_a_back";
|
||||
spellIcons = "AmSkillicon";
|
||||
firstSpell = 6;
|
||||
lastSpell = 36;
|
||||
}},
|
||||
SORCERESS ("so", 1) {{
|
||||
name = 4010;
|
||||
description = 5131;
|
||||
spellsBackground = "skltree_s_back";
|
||||
spellIcons = "SoSkillicon";
|
||||
firstSpell = 36;
|
||||
lastSpell = 66;
|
||||
fws = bws = nu3s = true;
|
||||
blendSpecial = BlendMode.LUMINOSITY;
|
||||
}},
|
||||
NECROMANCER("ne", 2) {{
|
||||
name = 4009;
|
||||
description = 5129;
|
||||
spellsBackground = "skltree_n_back";
|
||||
spellIcons = "NeSkillicon";
|
||||
firstSpell = 66;
|
||||
lastSpell = 96;
|
||||
fws = bws = nu3s = true;
|
||||
blendSpecial = BlendMode.LUMINOSITY;
|
||||
}},
|
||||
PALADIN ("pa", 3) {{
|
||||
name = 4008;
|
||||
description = 5132;
|
||||
spellsBackground = "skltree_p_back";
|
||||
spellIcons = "PaSkillicon";
|
||||
firstSpell = 96;
|
||||
lastSpell = 126;
|
||||
fws = true;
|
||||
blendSpecial = BlendMode.ID;
|
||||
}},
|
||||
BARBARIAN ("ba", 4) {{
|
||||
name = 4007;
|
||||
description = 5130;
|
||||
spellsBackground = "skltree_b_back";
|
||||
spellIcons = "BaSkillicon";
|
||||
firstSpell = 126;
|
||||
lastSpell = 156;
|
||||
fws = true;
|
||||
blendSpecial = BlendMode.ID;
|
||||
}},
|
||||
DRUID ("dz", 5) {{
|
||||
name = 4012;
|
||||
description = 22518;
|
||||
spellsBackground = "skltree_d_back";
|
||||
spellIcons = "DrSkillicon";
|
||||
firstSpell = 221;
|
||||
lastSpell = 251;
|
||||
}},
|
||||
ASSASSIN ("as", 6) {{
|
||||
name = 4013;
|
||||
description = 22519;
|
||||
spellsBackground = "skltree_i_back";
|
||||
spellIcons = "AsSkillicon";
|
||||
firstSpell = 251;
|
||||
lastSpell = 281;
|
||||
}},
|
||||
;
|
||||
|
||||
@ -48,6 +76,9 @@ public enum CharacterClass {
|
||||
public int name, description;
|
||||
public boolean nu3s = false, fws = false, bws = false;
|
||||
public int blendSpecial = BlendMode.NONE;
|
||||
public String spellsBackground;
|
||||
public String spellIcons;
|
||||
public int firstSpell, lastSpell;
|
||||
|
||||
CharacterClass(String shortName, int id) {
|
||||
this.shortName = shortName;
|
||||
|
@ -36,6 +36,8 @@ import com.riiablo.codec.excel.RarePrefix;
|
||||
import com.riiablo.codec.excel.RareSuffix;
|
||||
import com.riiablo.codec.excel.Runes;
|
||||
import com.riiablo.codec.excel.SetItems;
|
||||
import com.riiablo.codec.excel.SkillDesc;
|
||||
import com.riiablo.codec.excel.Skills;
|
||||
import com.riiablo.codec.excel.Sounds;
|
||||
import com.riiablo.codec.excel.Speech;
|
||||
import com.riiablo.codec.excel.UniqueItems;
|
||||
@ -75,6 +77,8 @@ public class Files {
|
||||
public final RareSuffix RareSuffix;
|
||||
public final Runes Runes;
|
||||
public final SetItems SetItems;
|
||||
public final Skills skills;
|
||||
public final SkillDesc skilldesc;
|
||||
public final Sounds Sounds;
|
||||
public final UniqueItems UniqueItems;
|
||||
//public final UniquePrefix UniquePrefix;
|
||||
@ -115,6 +119,8 @@ public class Files {
|
||||
PlrType = load(assets, PlrType.class);
|
||||
QualityItems = load(assets, QualityItems.class);
|
||||
SetItems = load(assets, SetItems.class, Excel.EXPANSION);
|
||||
skills = load(assets, Skills.class);
|
||||
skilldesc = load(assets, SkillDesc.class);
|
||||
Sounds = load(assets, Sounds.class);
|
||||
UniqueItems = load(assets, UniqueItems.class, Excel.EXPANSION);
|
||||
//UniquePrefix = load(assets, UniquePrefix.class);
|
||||
|
133
core/src/com/riiablo/codec/excel/SkillDesc.java
Normal file
133
core/src/com/riiablo/codec/excel/SkillDesc.java
Normal file
@ -0,0 +1,133 @@
|
||||
package com.riiablo.codec.excel;
|
||||
|
||||
public class SkillDesc extends Excel<SkillDesc.Entry> {
|
||||
public static class Entry extends Excel.Entry {
|
||||
@Override
|
||||
public String toString() {
|
||||
return skilldesc;
|
||||
}
|
||||
|
||||
@Key
|
||||
@Column
|
||||
public String skilldesc;
|
||||
@Column public int SkillPage;
|
||||
@Column public int SkillRow;
|
||||
@Column public int SkillColumn;
|
||||
@Column public int ListRow;
|
||||
@Column public int ListPool;
|
||||
@Column public int IconCel;
|
||||
@Column(format = "str name")
|
||||
public String str_name;
|
||||
@Column(format = "str short")
|
||||
public String str_short;
|
||||
@Column(format = "str long")
|
||||
public String str_long;
|
||||
@Column(format = "str alt")
|
||||
public String str_alt;
|
||||
@Column(format = "str mana")
|
||||
public String str_mana;
|
||||
@Column public String descdam;
|
||||
@Column(format = "ddam calc1")
|
||||
public String ddam_calc1;
|
||||
@Column(format = "ddam calc2")
|
||||
public String ddam_calc2;
|
||||
@Column public String p1dmelem;
|
||||
@Column public String p1dmmin;
|
||||
@Column public String p1dmmax;
|
||||
@Column public String p2dmelem;
|
||||
@Column public String p2dmmin;
|
||||
@Column public String p2dmmax;
|
||||
@Column public String p3dmelem;
|
||||
@Column public String p3dmmin;
|
||||
@Column public String p3dmmax;
|
||||
@Column public String descatt;
|
||||
@Column public String descmissile1;
|
||||
@Column public String descmissile2;
|
||||
@Column public String descmissile3;
|
||||
@Column public String descline1;
|
||||
@Column public String desctexta1;
|
||||
@Column public String desctextb1;
|
||||
@Column public String desccalca1;
|
||||
@Column public String desccalcb1;
|
||||
@Column public String descline2;
|
||||
@Column public String desctexta2;
|
||||
@Column public String desctextb2;
|
||||
@Column public String desccalca2;
|
||||
@Column public String desccalcb2;
|
||||
@Column public String descline3;
|
||||
@Column public String desctexta3;
|
||||
@Column public String desctextb3;
|
||||
@Column public String desccalca3;
|
||||
@Column public String desccalcb3;
|
||||
@Column public String descline4;
|
||||
@Column public String desctexta4;
|
||||
@Column public String desctextb4;
|
||||
@Column public String desccalca4;
|
||||
@Column public String desccalcb4;
|
||||
@Column public String descline5;
|
||||
@Column public String desctexta5;
|
||||
@Column public String desctextb5;
|
||||
@Column public String desccalca5;
|
||||
@Column public String desccalcb5;
|
||||
@Column public String descline6;
|
||||
@Column public String desctexta6;
|
||||
@Column public String desctextb6;
|
||||
@Column public String desccalca6;
|
||||
@Column public String desccalcb6;
|
||||
@Column public String dsc2line1;
|
||||
@Column public String dsc2texta1;
|
||||
@Column public String dsc2textb1;
|
||||
@Column public String dsc2calca1;
|
||||
@Column public String dsc2calcb1;
|
||||
@Column public String dsc2line2;
|
||||
@Column public String dsc2texta2;
|
||||
@Column public String dsc2textb2;
|
||||
@Column public String dsc2calca2;
|
||||
@Column public String dsc2calcb2;
|
||||
@Column public String dsc2line3;
|
||||
@Column public String dsc2texta3;
|
||||
@Column public String dsc2textb3;
|
||||
@Column public String dsc2calca3;
|
||||
@Column public String dsc2calcb3;
|
||||
@Column public String dsc2line4;
|
||||
@Column public String dsc2texta4;
|
||||
@Column public String dsc2textb4;
|
||||
@Column public String dsc2calca4;
|
||||
@Column public String dsc2calcb4;
|
||||
@Column public String dsc3line1;
|
||||
@Column public String dsc3texta1;
|
||||
@Column public String dsc3textb1;
|
||||
@Column public String dsc3calca1;
|
||||
@Column public String dsc3calcb1;
|
||||
@Column public String dsc3line2;
|
||||
@Column public String dsc3texta2;
|
||||
@Column public String dsc3textb2;
|
||||
@Column public String dsc3calca2;
|
||||
@Column public String dsc3calcb2;
|
||||
@Column public String dsc3line3;
|
||||
@Column public String dsc3texta3;
|
||||
@Column public String dsc3textb3;
|
||||
@Column public String dsc3calca3;
|
||||
@Column public String dsc3calcb3;
|
||||
@Column public String dsc3line4;
|
||||
@Column public String dsc3texta4;
|
||||
@Column public String dsc3textb4;
|
||||
@Column public String dsc3calca4;
|
||||
@Column public String dsc3calcb4;
|
||||
@Column public String dsc3line5;
|
||||
@Column public String dsc3texta5;
|
||||
@Column public String dsc3textb5;
|
||||
@Column public String dsc3calca5;
|
||||
@Column public String dsc3calcb5;
|
||||
@Column public String dsc3line6;
|
||||
@Column public String dsc3texta6;
|
||||
@Column public String dsc3textb6;
|
||||
@Column public String dsc3calca6;
|
||||
@Column public String dsc3calcb6;
|
||||
@Column public String dsc3line7;
|
||||
@Column public String dsc3texta7;
|
||||
@Column public String dsc3textb7;
|
||||
@Column public String dsc3calca7;
|
||||
@Column public String dsc3calcb7;
|
||||
}
|
||||
}
|
24
core/src/com/riiablo/codec/excel/Skills.java
Normal file
24
core/src/com/riiablo/codec/excel/Skills.java
Normal file
@ -0,0 +1,24 @@
|
||||
package com.riiablo.codec.excel;
|
||||
|
||||
public class Skills extends Excel<Skills.Entry> {
|
||||
public static class Entry extends Excel.Entry {
|
||||
@Override
|
||||
public String toString() {
|
||||
return skill;
|
||||
}
|
||||
|
||||
@Key
|
||||
@Column
|
||||
public int Id;
|
||||
@Column public String skill;
|
||||
@Column public String charclass;
|
||||
@Column public String skilldesc;
|
||||
@Column public String stsound;
|
||||
@Column public String castoverlay;
|
||||
@Column public String anim;
|
||||
@Column public String seqtrans;
|
||||
@Column public String monanim;
|
||||
@Column public int seqnum;
|
||||
@Column public int seqinput;
|
||||
}
|
||||
}
|
@ -86,6 +86,7 @@ public class Player extends Entity {
|
||||
boolean alternate;
|
||||
boolean ignoreUpdate;
|
||||
public Stats stats;
|
||||
public final CharacterClass charClass;
|
||||
|
||||
Array<Item> inventory = new Array<>();
|
||||
|
||||
@ -115,6 +116,7 @@ public class Player extends Entity {
|
||||
|
||||
Player(String name, int classId) {
|
||||
super(Type.PLR, "player", TOKENS[classId]);
|
||||
charClass = CharacterClass.get(classId);
|
||||
setMode(MODE_TN);
|
||||
setWalkSpeed(6);
|
||||
setRunSpeed(9);
|
||||
|
@ -228,7 +228,7 @@ public class ControlPanel extends WidgetGroup implements Disposable {
|
||||
} else if (actor == btnInventory) {
|
||||
gameScreen.inventoryPanel.setVisible(!gameScreen.inventoryPanel.isVisible());
|
||||
} else if (actor == btnSkillTree) {
|
||||
|
||||
gameScreen.spellsPanel.setVisible(!gameScreen.spellsPanel.isVisible());
|
||||
} else if (actor == btnParty) {
|
||||
|
||||
} else if (actor == btnMap) {
|
||||
|
@ -42,7 +42,7 @@ public class MobilePanel extends Table implements Disposable {
|
||||
} else if (actor == btnInventory) {
|
||||
gameScreen.inventoryPanel.setVisible(!gameScreen.inventoryPanel.isVisible());
|
||||
} else if (actor == btnSkillTree) {
|
||||
|
||||
gameScreen.spellsPanel.setVisible(!gameScreen.spellsPanel.isVisible());
|
||||
} else if (actor == btnParty) {
|
||||
|
||||
} else if (actor == btnMap) {
|
||||
|
123
core/src/com/riiablo/panel/SpellsPanel.java
Normal file
123
core/src/com/riiablo/panel/SpellsPanel.java
Normal file
@ -0,0 +1,123 @@
|
||||
package com.riiablo.panel;
|
||||
|
||||
import com.badlogic.gdx.assets.AssetDescriptor;
|
||||
import com.badlogic.gdx.graphics.g2d.Batch;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import com.badlogic.gdx.scenes.scene2d.Actor;
|
||||
import com.badlogic.gdx.scenes.scene2d.InputEvent;
|
||||
import com.badlogic.gdx.scenes.scene2d.Touchable;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.WidgetGroup;
|
||||
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
|
||||
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
|
||||
import com.badlogic.gdx.utils.Disposable;
|
||||
import com.riiablo.CharacterClass;
|
||||
import com.riiablo.Riiablo;
|
||||
import com.riiablo.codec.DC6;
|
||||
import com.riiablo.codec.excel.SkillDesc;
|
||||
import com.riiablo.codec.excel.Skills;
|
||||
import com.riiablo.loader.DC6Loader;
|
||||
import com.riiablo.screen.GameScreen;
|
||||
import com.riiablo.widget.Button;
|
||||
|
||||
public class SpellsPanel extends WidgetGroup implements Disposable {
|
||||
private static final String TAG = "SpellsPanel";
|
||||
private static final String SPELLS_PATH = "data\\global\\ui\\SPELLS\\";
|
||||
|
||||
final AssetDescriptor<DC6> skltreeDescriptor;
|
||||
TextureRegion skltree;
|
||||
TextureRegion skltreeTabs[];
|
||||
|
||||
final AssetDescriptor<DC6> SkilliconDescriptor;
|
||||
DC6 Skillicon;
|
||||
|
||||
final GameScreen gameScreen;
|
||||
|
||||
public SpellsPanel(final GameScreen gameScreen) {
|
||||
this.gameScreen = gameScreen;
|
||||
|
||||
CharacterClass charClass = gameScreen.player.charClass;
|
||||
skltreeDescriptor = new AssetDescriptor<>(SPELLS_PATH + charClass.spellsBackground + ".dc6", DC6.class, DC6Loader.DC6Parameters.COMBINE);
|
||||
Riiablo.assets.load(skltreeDescriptor);
|
||||
Riiablo.assets.finishLoadingAsset(skltreeDescriptor);
|
||||
skltree = Riiablo.assets.get(skltreeDescriptor).getTexture(0);
|
||||
setSize(skltree.getRegionWidth(), skltree.getRegionHeight());
|
||||
setTouchable(Touchable.enabled);
|
||||
setVisible(false);
|
||||
|
||||
SkilliconDescriptor = new AssetDescriptor<>(SPELLS_PATH + charClass.spellIcons + ".dc6", DC6.class, DC6Loader.DC6Parameters.COMBINE);
|
||||
Riiablo.assets.load(SkilliconDescriptor);
|
||||
Riiablo.assets.finishLoadingAsset(SkilliconDescriptor);
|
||||
Skillicon = Riiablo.assets.get(SkilliconDescriptor);
|
||||
|
||||
final Tab[] tabs = new Tab[4];
|
||||
for (int i = 1; i < tabs.length; i++) {
|
||||
Tab tab = tabs[i] = new Tab(Riiablo.assets.get(skltreeDescriptor).getTexture(i));
|
||||
tab.setSize(getWidth(), getHeight());
|
||||
tab.setPosition(0, 0);
|
||||
tab.setVisible(false);
|
||||
addActor(tab);
|
||||
}
|
||||
|
||||
float x = getWidth() - 90, y = 0;
|
||||
Actor[] actors = new Actor[3];
|
||||
for (int i = 0; i < actors.length; i++) {
|
||||
final Actor actor = actors[i] = new Actor();
|
||||
actor.setPosition(x, y);
|
||||
actor.setSize(90, getHeight() / 4);
|
||||
actor.setUserObject(tabs[i + 1]);
|
||||
actor.addListener(new ClickListener() {
|
||||
@Override
|
||||
public void clicked(InputEvent event, float x, float y) {
|
||||
for (Tab tab : tabs) if (tab != null) tab.setVisible(false);
|
||||
Tab tab = (Tab) actor.getUserObject();
|
||||
tab.setVisible(true);
|
||||
}
|
||||
});
|
||||
addActor(actor);
|
||||
y += actor.getHeight();
|
||||
}
|
||||
|
||||
float[] X = { 0, 15, 84, 153 };
|
||||
float[] Y = { 0, 370, 302, 234, 166, 98, 30 };
|
||||
for (int i = charClass.firstSpell; i < charClass.lastSpell; i++) {
|
||||
Skills.Entry skill = Riiablo.files.skills.get(i);
|
||||
SkillDesc.Entry desc = Riiablo.files.skilldesc.get(skill.skilldesc);
|
||||
Button button = new Button(new Button.ButtonStyle(
|
||||
new TextureRegionDrawable(Skillicon.getTexture(desc.IconCel)),
|
||||
new TextureRegionDrawable(Skillicon.getTexture(desc.IconCel + 1))));
|
||||
button.setPosition(X[desc.SkillColumn], Y[desc.SkillRow]);
|
||||
button.setSize(48, 48);
|
||||
|
||||
Tab tab = tabs[desc.SkillPage];
|
||||
tab.addActor(button);
|
||||
}
|
||||
|
||||
setDebug(true, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Batch batch, float parentAlpha) {
|
||||
batch.draw(skltree, getX(), getY());
|
||||
super.draw(batch, parentAlpha);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
Riiablo.assets.unload(skltreeDescriptor.fileName);
|
||||
Riiablo.assets.unload(SkilliconDescriptor.fileName);
|
||||
}
|
||||
|
||||
private static class Tab extends WidgetGroup {
|
||||
TextureRegion background;
|
||||
|
||||
public Tab(TextureRegion background) {
|
||||
this.background = background;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Batch batch, float parentAlpha) {
|
||||
batch.draw(background, getX(), getY());
|
||||
super.draw(batch, parentAlpha);
|
||||
}
|
||||
}
|
||||
}
|
@ -53,6 +53,7 @@ import com.riiablo.panel.ControlPanel;
|
||||
import com.riiablo.panel.EscapePanel;
|
||||
import com.riiablo.panel.InventoryPanel;
|
||||
import com.riiablo.panel.MobilePanel;
|
||||
import com.riiablo.panel.SpellsPanel;
|
||||
import com.riiablo.panel.StashPanel;
|
||||
import com.riiablo.server.Connect;
|
||||
import com.riiablo.server.ConnectResponse;
|
||||
@ -95,6 +96,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
|
||||
MobilePanel mobilePanel;
|
||||
public InventoryPanel inventoryPanel;
|
||||
public CharacterPanel characterPanel;
|
||||
public SpellsPanel spellsPanel;
|
||||
public StashPanel stashPanel;
|
||||
MappedKeyStateAdapter mappedKeyStateListener;
|
||||
|
||||
@ -210,6 +212,11 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
|
||||
stage.getWidth() - inventoryPanel.getWidth(),
|
||||
stage.getHeight() - inventoryPanel.getHeight());
|
||||
|
||||
spellsPanel = new SpellsPanel(this);
|
||||
spellsPanel.setPosition(
|
||||
stage.getWidth() - spellsPanel.getWidth(),
|
||||
stage.getHeight() - spellsPanel.getHeight());
|
||||
|
||||
characterPanel = new CharacterPanel(this);
|
||||
characterPanel.setPosition(
|
||||
0,
|
||||
@ -227,6 +234,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
|
||||
stage.addActor(controlPanel);
|
||||
stage.addActor(escapePanel);
|
||||
stage.addActor(inventoryPanel);
|
||||
stage.addActor(spellsPanel);
|
||||
stage.addActor(characterPanel);
|
||||
stage.addActor(stashPanel);
|
||||
controlPanel.toFront();
|
||||
@ -263,8 +271,10 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
|
||||
} else if (input.isVisible()) {
|
||||
input.setVisible(false);
|
||||
} else if (inventoryPanel.isVisible()
|
||||
|| spellsPanel.isVisible()
|
||||
|| characterPanel.isVisible()) {
|
||||
inventoryPanel.setVisible(false);
|
||||
spellsPanel.setVisible(false);
|
||||
characterPanel.setVisible(false);
|
||||
} else {
|
||||
escapePanel.setVisible(true);
|
||||
@ -287,6 +297,8 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
|
||||
}
|
||||
} else if (key == Keys.Inventory) {
|
||||
inventoryPanel.setVisible(!inventoryPanel.isVisible());
|
||||
} else if (key == Keys.Spells) {
|
||||
spellsPanel.setVisible(!spellsPanel.isVisible());
|
||||
} else if (key == Keys.Character) {
|
||||
stashPanel.setVisible(false);
|
||||
characterPanel.setVisible(!characterPanel.isVisible());
|
||||
@ -564,6 +576,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
|
||||
|
||||
Keys.Esc.addStateListener(mappedKeyStateListener);
|
||||
Keys.Inventory.addStateListener(mappedKeyStateListener);
|
||||
Keys.Spells.addStateListener(mappedKeyStateListener);
|
||||
Keys.Character.addStateListener(mappedKeyStateListener);
|
||||
Keys.Stash.addStateListener(mappedKeyStateListener);
|
||||
Keys.SwapWeapons.addStateListener(mappedKeyStateListener);
|
||||
@ -608,6 +621,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
|
||||
|
||||
Keys.Esc.removeStateListener(mappedKeyStateListener);
|
||||
Keys.Inventory.removeStateListener(mappedKeyStateListener);
|
||||
Keys.Spells.removeStateListener(mappedKeyStateListener);
|
||||
Keys.Character.removeStateListener(mappedKeyStateListener);
|
||||
Keys.Stash.removeStateListener(mappedKeyStateListener);
|
||||
Keys.SwapWeapons.removeStateListener(mappedKeyStateListener);
|
||||
@ -624,6 +638,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
|
||||
escapePanel.dispose();
|
||||
controlPanel.dispose();
|
||||
inventoryPanel.dispose();
|
||||
spellsPanel.dispose();
|
||||
characterPanel.dispose();
|
||||
if (mobilePanel != null) mobilePanel.dispose();
|
||||
if (Riiablo.assets.isLoaded(touchpadBackgroundDescriptor)) Riiablo.assets.load(touchpadBackgroundDescriptor);
|
||||
|
Loading…
Reference in New Issue
Block a user