v1.4.0: adjusted code for several plant effects, added a rotberry effect
This commit is contained in:
@@ -18,7 +18,7 @@ plants.earthroot.desc=When a creature touches an earthroot, its roots create a k
|
|||||||
plants.earthroot.warden_desc=The roots of an earthroot plant will move with _the Warden_, providing her mobile barkskin armor.
|
plants.earthroot.warden_desc=The roots of an earthroot plant will move with _the Warden_, providing her mobile barkskin armor.
|
||||||
plants.earthroot$seed.name=seed of earthroot
|
plants.earthroot$seed.name=seed of earthroot
|
||||||
plants.earthroot$armor.name=herbal armor
|
plants.earthroot$armor.name=herbal armor
|
||||||
plants.earthroot$armor.desc=A kind of natural, immobile armor is protecting you. The armor forms plates of bark and twine, wrapping around your body.\n\nThis herbal armor will block %d damage from any physical hit you take, until it eventually runs out of durability and collapses.\n\nAs the armor is immobile, if you attempt to move it will break apart and be lost.\n\nArmor remaining: %d.
|
plants.earthroot$armor.desc=A kind of natural, immobile armor made of bark and twine.\n\nThis herbal armor will block %d damage from any physical hit, until it eventually runs out of durability and collapses.\n\nAs the armor is immobile, moving will cause it to break apart and be lost.\n\nArmor remaining: %d.
|
||||||
|
|
||||||
plants.fadeleaf.name=fadeleaf
|
plants.fadeleaf.name=fadeleaf
|
||||||
plants.fadeleaf.desc=Touching a fadeleaf will teleport any creature to a random place on the current level.
|
plants.fadeleaf.desc=Touching a fadeleaf will teleport any creature to a random place on the current level.
|
||||||
@@ -43,7 +43,7 @@ plants.plant$seed$placeholder.name=seed
|
|||||||
|
|
||||||
plants.rotberry.name=rotberry
|
plants.rotberry.name=rotberry
|
||||||
plants.rotberry.desc=The berries of a young rotberry shrub taste like sweet, sweet death. Over a few years, this rotberry shrub will grow into another rot heart.
|
plants.rotberry.desc=The berries of a young rotberry shrub taste like sweet, sweet death. Over a few years, this rotberry shrub will grow into another rot heart.
|
||||||
plants.rotberry.warden_desc=Normally a rotberry bush has no effect when trampled, but _the Warden_ is able to harness energy from it to temporarily boost her strength!
|
plants.rotberry.warden_desc=Normally a rotberry bush only produces a little gas when trampled, but _the Warden_ is able to harness energy from it to temporarily boost her strength!
|
||||||
plants.rotberry$seed.name=seed of rotberry
|
plants.rotberry$seed.name=seed of rotberry
|
||||||
|
|
||||||
plants.sorrowmoss.name=sorrowmoss
|
plants.sorrowmoss.name=sorrowmoss
|
||||||
@@ -66,11 +66,11 @@ plants.sungrass.desc=Sungrass is renowned for its sap's slow but effective heali
|
|||||||
plants.sungrass.warden_desc=_The Warden_ can receive healing from trampled sungrass even if she moves away from it.
|
plants.sungrass.warden_desc=_The Warden_ can receive healing from trampled sungrass even if she moves away from it.
|
||||||
plants.sungrass$seed.name=seed of sungrass
|
plants.sungrass$seed.name=seed of sungrass
|
||||||
plants.sungrass$health.name=herbal healing
|
plants.sungrass$health.name=herbal healing
|
||||||
plants.sungrass$health.desc=Sungrass possesses excellent healing properties, though it is much slower than a potion of healing.\n\nYou are currently slowly regenerating health from the sungrass plant. Moving off the plant will break the healing effect.\n\nHealing remaining: %d.
|
plants.sungrass$health.desc=Sungrass possesses excellent healing properties, though it is much slower than a potion of healing.\n\nMoving off the plant will break the healing effect.\n\nHealing remaining: %d.
|
||||||
|
|
||||||
plants.swiftthistle.name=swiftthistle
|
plants.swiftthistle.name=swiftthistle
|
||||||
plants.swiftthistle.desc=When trampled, swiftthistle will briefly accelerate the flow of time around it, allowing the trampler to perform several actions instantly.
|
plants.swiftthistle.desc=When trampled, swiftthistle will briefly accelerate the flow of time around it, allowing the trampler to perform several actions instantly.
|
||||||
plants.swiftthistle.warden_desc=In addition to gaining instantaneous actions, _the Warden_ will also get a brief haste boost when trampling swiftthistle.
|
plants.swiftthistle.warden_desc=In addition to gaining instantaneous actions, _the Warden_ will also get a brief haste boost when trampling swiftthistle.
|
||||||
plants.swiftthistle$seed.name=seed of swiftthistle
|
plants.swiftthistle$seed.name=seed of swiftthistle
|
||||||
plants.swiftthistle$timebubble.name=time bubble
|
plants.swiftthistle$timebubble.name=time bubble
|
||||||
plants.swiftthistle$timebubble.desc=You are in a small bubble of accelerated time, allowing you to perform actions instantly. Attacking or using magic will break this effect however.\n\nTurns remaining: %s.
|
plants.swiftthistle$timebubble.desc=A small bubble of accelerated time, allowing actions to be performed instantly. Attacking or using magic will break this effect however.\n\nTurns remaining: %s.
|
||||||
|
|||||||
@@ -55,8 +55,8 @@ public abstract class Actor implements Bundlable {
|
|||||||
|
|
||||||
protected abstract boolean act();
|
protected abstract boolean act();
|
||||||
|
|
||||||
//Always spends exactly one tick, regardless of time-influencing factors
|
//Always spends exactly the specified amount of time, regardless of time-influencing factors
|
||||||
protected final void spendConstant( float time ){
|
protected void spendConstant( float time ){
|
||||||
this.time += time;
|
this.time += time;
|
||||||
//if time is very close to a whole number, round to a whole number to fix errors
|
//if time is very close to a whole number, round to a whole number to fix errors
|
||||||
float ex = Math.abs(this.time % 1f);
|
float ex = Math.abs(this.time % 1f);
|
||||||
@@ -65,7 +65,7 @@ public abstract class Actor implements Bundlable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//can be overridden for time to be affected by various factors
|
//sends time, but the amount can be influenced
|
||||||
protected void spend( float time ) {
|
protected void spend( float time ) {
|
||||||
spendConstant( time );
|
spendConstant( time );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic;
|
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Potential;
|
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Potential;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity;
|
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfCleansing;
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfCleansing;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfArcana;
|
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfArcana;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements;
|
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements;
|
||||||
@@ -104,6 +105,8 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Door;
|
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Door;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.GrimTrap;
|
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.GrimTrap;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.plants.Earthroot;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.plants.Swiftthistle;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
|
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
|
||||||
@@ -540,6 +543,12 @@ public abstract class Char extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int defenseProc( Char enemy, int damage ) {
|
public int defenseProc( Char enemy, int damage ) {
|
||||||
|
|
||||||
|
Earthroot.Armor armor = buff( Earthroot.Armor.class );
|
||||||
|
if (armor != null) {
|
||||||
|
damage = armor.absorb( damage );
|
||||||
|
}
|
||||||
|
|
||||||
return damage;
|
return damage;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -729,6 +738,23 @@ public abstract class Char extends Actor {
|
|||||||
return HP > 0 || deathMarked;
|
return HP > 0 || deathMarked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void spendConstant(float time) {
|
||||||
|
TimekeepersHourglass.timeFreeze freeze = buff(TimekeepersHourglass.timeFreeze.class);
|
||||||
|
if (freeze != null) {
|
||||||
|
freeze.processTime(time);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Swiftthistle.TimeBubble bubble = buff(Swiftthistle.TimeBubble.class);
|
||||||
|
if (bubble != null){
|
||||||
|
bubble.processTime(time);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
super.spendConstant(time);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void spend( float time ) {
|
protected void spend( float time ) {
|
||||||
|
|
||||||
|
|||||||
@@ -627,17 +627,6 @@ public class Hero extends Char {
|
|||||||
@Override
|
@Override
|
||||||
public void spend( float time ) {
|
public void spend( float time ) {
|
||||||
justMoved = false;
|
justMoved = false;
|
||||||
TimekeepersHourglass.timeFreeze freeze = buff(TimekeepersHourglass.timeFreeze.class);
|
|
||||||
if (freeze != null) {
|
|
||||||
freeze.processTime(time);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Swiftthistle.TimeBubble bubble = buff(Swiftthistle.TimeBubble.class);
|
|
||||||
if (bubble != null){
|
|
||||||
bubble.processTime(time);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
super.spend(time);
|
super.spend(time);
|
||||||
}
|
}
|
||||||
@@ -1213,17 +1202,12 @@ public class Hero extends Char {
|
|||||||
damage = belongings.armor().proc( enemy, this, damage );
|
damage = belongings.armor().proc( enemy, this, damage );
|
||||||
}
|
}
|
||||||
|
|
||||||
Earthroot.Armor armor = buff( Earthroot.Armor.class );
|
|
||||||
if (armor != null) {
|
|
||||||
damage = armor.absorb( damage );
|
|
||||||
}
|
|
||||||
|
|
||||||
WandOfLivingEarth.RockArmor rockArmor = buff(WandOfLivingEarth.RockArmor.class);
|
WandOfLivingEarth.RockArmor rockArmor = buff(WandOfLivingEarth.RockArmor.class);
|
||||||
if (rockArmor != null) {
|
if (rockArmor != null) {
|
||||||
damage = rockArmor.absorb(damage);
|
damage = rockArmor.absorb(damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
return damage;
|
return super.defenseProc( enemy, damage );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+2
-2
@@ -91,8 +91,8 @@ public class ArmoredStatue extends Statue {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int defenseProc(Char enemy, int damage) {
|
public int defenseProc(Char enemy, int damage) {
|
||||||
damage = super.defenseProc(enemy, damage);
|
damage = armor.proc(enemy, this, damage);
|
||||||
return armor.proc(enemy, this, damage);
|
return super.defenseProc(enemy, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -650,7 +650,7 @@ public abstract class Mob extends Char {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return damage;
|
return super.defenseProc(enemy, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+2
-4
@@ -185,12 +185,10 @@ public class PrismaticImage extends NPC {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int defenseProc(Char enemy, int damage) {
|
public int defenseProc(Char enemy, int damage) {
|
||||||
damage = super.defenseProc(enemy, damage);
|
|
||||||
if (hero != null && hero.belongings.armor() != null){
|
if (hero != null && hero.belongings.armor() != null){
|
||||||
return hero.belongings.armor().proc( enemy, this, damage );
|
damage = hero.belongings.armor().proc( enemy, this, damage );
|
||||||
} else {
|
|
||||||
return damage;
|
|
||||||
}
|
}
|
||||||
|
return super.defenseProc(enemy, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+1
@@ -382,6 +382,7 @@ public class TimekeepersHourglass extends Artifact {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fx(boolean on) {
|
public void fx(boolean on) {
|
||||||
|
if (!(target instanceof Hero)) return;
|
||||||
Emitter.freezeEmitters = on;
|
Emitter.freezeEmitters = on;
|
||||||
if (on){
|
if (on){
|
||||||
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
|
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EarthParticle;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EarthParticle;
|
||||||
@@ -44,8 +45,8 @@ public class Earthroot extends Plant {
|
|||||||
@Override
|
@Override
|
||||||
public void activate( Char ch ) {
|
public void activate( Char ch ) {
|
||||||
|
|
||||||
if (ch == Dungeon.hero) {
|
if (ch != null){
|
||||||
if (Dungeon.hero.subClass == HeroSubClass.WARDEN){
|
if (ch instanceof Hero && ((Hero) ch).subClass == HeroSubClass.WARDEN) {
|
||||||
Buff.affect(ch, Barkskin.class).set(Dungeon.hero.lvl + 5, 5);
|
Buff.affect(ch, Barkskin.class).set(Dungeon.hero.lvl + 5, 5);
|
||||||
} else {
|
} else {
|
||||||
Buff.affect(ch, Armor.class).level(ch.HT);
|
Buff.affect(ch, Armor.class).level(ch.HT);
|
||||||
|
|||||||
@@ -23,12 +23,15 @@ package com.shatteredpixel.shatteredpixeldungeon.plants;
|
|||||||
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AdrenalineSurge;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AdrenalineSurge;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.LeafParticle;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.LeafParticle;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||||
|
|
||||||
public class Rotberry extends Plant {
|
public class Rotberry extends Plant {
|
||||||
@@ -42,6 +45,8 @@ public class Rotberry extends Plant {
|
|||||||
public void activate( Char ch ) {
|
public void activate( Char ch ) {
|
||||||
if (ch instanceof Hero && ((Hero) ch).subClass == HeroSubClass.WARDEN){
|
if (ch instanceof Hero && ((Hero) ch).subClass == HeroSubClass.WARDEN){
|
||||||
Buff.affect(ch, AdrenalineSurge.class).reset(1, AdrenalineSurge.DURATION);
|
Buff.affect(ch, AdrenalineSurge.class).reset(1, AdrenalineSurge.DURATION);
|
||||||
|
} else {
|
||||||
|
GameScene.add( Blob.seed( pos, 100, ToxicGas.class ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
Dungeon.level.drop( new Seed(), pos ).sprite.drop();
|
Dungeon.level.drop( new Seed(), pos ).sprite.drop();
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ public class Sungrass extends Plant {
|
|||||||
@Override
|
@Override
|
||||||
public void activate( Char ch ) {
|
public void activate( Char ch ) {
|
||||||
|
|
||||||
if (ch == Dungeon.hero) {
|
if (ch != null){
|
||||||
if (Dungeon.hero.subClass == HeroSubClass.WARDEN) {
|
if (ch instanceof Hero && ((Hero) ch).subClass == HeroSubClass.WARDEN) {
|
||||||
Buff.affect(ch, Healing.class).setHeal(ch.HT, 0, 1);
|
Buff.affect(ch, Healing.class).setHeal(ch.HT, 0, 1);
|
||||||
} else {
|
} else {
|
||||||
Buff.affect(ch, Health.class).boost(ch.HT);
|
Buff.affect(ch, Health.class).boost(ch.HT);
|
||||||
|
|||||||
+4
-2
@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
|
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
|
||||||
@@ -47,9 +48,9 @@ public class Swiftthistle extends Plant {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void activate( Char ch ) {
|
public void activate( Char ch ) {
|
||||||
if (ch == Dungeon.hero) {
|
if (ch != null) {
|
||||||
Buff.affect(ch, TimeBubble.class).reset();
|
Buff.affect(ch, TimeBubble.class).reset();
|
||||||
if (Dungeon.hero.subClass == HeroSubClass.WARDEN){
|
if (ch instanceof Hero && ((Hero) ch).subClass == HeroSubClass.WARDEN){
|
||||||
Buff.affect(ch, Haste.class, 1f);
|
Buff.affect(ch, Haste.class, 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,6 +147,7 @@ public class Swiftthistle extends Plant {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fx(boolean on) {
|
public void fx(boolean on) {
|
||||||
|
if (!(target instanceof Hero)) return;
|
||||||
Emitter.freezeEmitters = on;
|
Emitter.freezeEmitters = on;
|
||||||
if (on){
|
if (on){
|
||||||
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
|
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
|
||||||
|
|||||||
Reference in New Issue
Block a user