We modded wall of fire to create a wall of stone using cep wall places, way back when in 2005 or so, for casters over a certain level. You just spawn in a wall, and the default orientation is as Sethan describes. You could, I suppose, add alternate orientations to subradial spells, but that seems like a lot of effort for little gain. Here's the spellscript:
//::///////////////////////////////////////////////
//:: Wall of Fire
//:: NW_S0_WallFire.nss
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Creates a wall of fire that burns any creature
entering the area around the wall. Those moving
through the AOE are burned for 4d6 fire damage
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: July 17, 2001
//:://////////////////////////////////////////////
#include "hg_inc"
#include "ac_spell_inc"
void DestroyWall(object oWall) {
if (GetIsObjectValid(oWall)) {
DestroyObject(oWall);
}
}
void main() {
struct SpellInfo si = GetSpellInfo();
if (si.id < 0)
return;
/* Get the location where the wall is to be placed. */
object oDoor = GetNearestObjectToLocation(OBJECT_TYPE_DOOR, si.loc);
location lDoor = GetLocation(oDoor);
float fDist = GetDistanceBetweenLocations(si.loc, lDoor);
int nDoor = ((fDist < 2.0) && (GetIsObjectValid(oDoor)) && (!GetIsOpen(oDoor)));
/* check for Hell energy barriers */
if (!nDoor) {
object oCheck = GetFirstObjectInShape(SHAPE_SPHERE, 2.0, si.loc, FALSE, OBJECT_TYPE_PLACEABLE);
while (GetIsObjectValid(oCheck)) {
if ((GetTag(oCheck) == "helldoor") && (!GetLocalInt(oCheck, "Open")))
nDoor = TRUE;
oCheck = GetNextObjectInShape(SHAPE_SPHERE, 2.0, si.loc, FALSE, OBJECT_TYPE_PLACEABLE);
}
}
object oPush = GetNearestCreatureToLocation(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, si.loc);
if (si.clevel >= 20 && GetIsObjectValid(oPush) && GetDistanceBetweenLocations(si.loc, GetLocation(oPush)) < 3.0) {
FloatingTextStringOnCreature("Wall of Stone cannot be cast near a player.", si.caster, FALSE);
return;
}
object oArea = GetArea(si.caster);
object oTest = GetNearestObjectByTag("wizwallostone");
if (si.clevel < 20 && GetLocalString(oArea, "Area_SpellHook") == "zwund_spellhook") {
FloatingTextStringOnCreature("The water quenches the flames of your spell.", si.caster, FALSE);
return;
}
if (si.clevel >= 20 && GetLocalInt(oArea, "NO_PVP")) {
int bAllow = FALSE;
/* allow people to push up to the bench in town */
if (GetResRef(oArea) == "townofascension") {
vector vPos = GetPosition(si.caster);
if (vPos.x >= 0.0 && vPos.x <= 10.0 && vPos.y >= 40.0 && vPos.y <= 50.0)
bAllow = TRUE;
}
if (!bAllow) {
FloatingTextStringOnCreature("Wall of Stone cannot be cast in No PVP areas.", si.caster, FALSE);
return;
}
}
if (GetIsObjectValid(oTest)) {
DestroyObject(oTest);
FloatingTextStringOnCreature("Only one wall of stone may exist in an area at the same time.", si.caster, FALSE);
}
float fDur = MetaDuration(si, si.clevel / 2, DURATION_IN_ROUNDS);
object oWall;
effect eAOE = EffectAreaOfEffect(AOE_PER_WALLFIRE);
if (!GetIsPC(si.caster)) {
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, si.loc, fDur);
} else if (si.clevel >= 40) {
if (!nDoor) {
oWall = CreateObject(OBJECT_TYPE_PLACEABLE, "wallofstone40", si.loc);
AssignCommand(oArea, DelayCommand(RoundsToSeconds(40), DestroyWall(oWall)));
} else
FloatingTextStringOnCreature("Wall of stone may not be cast so close to a closed door.", si.caster, FALSE);
} else if (si.clevel >= 35) {
if (!nDoor) {
oWall = CreateObject(OBJECT_TYPE_PLACEABLE, "wallofstone35", si.loc);
AssignCommand(oArea, DelayCommand(fDur, DestroyWall(oWall)));
} else
FloatingTextStringOnCreature("Wall of stone may not be cast so close to a closed door.", si.caster, FALSE);
} else if (si.clevel >= 30) {
if (!nDoor) {
oWall = CreateObject(OBJECT_TYPE_PLACEABLE, "wallofstone30", si.loc);
AssignCommand(oArea, DelayCommand(fDur, DestroyWall(oWall)));
} else
FloatingTextStringOnCreature("Wall of stone may not be cast so close to a closed door.", si.caster, FALSE);
} else if (si.clevel >= 25) {
if (!nDoor) {
oWall = CreateObject(OBJECT_TYPE_PLACEABLE, "wallofstone25", si.loc);
AssignCommand(oArea, DelayCommand(fDur, DestroyWall(oWall)));
} else
FloatingTextStringOnCreature("Wall of stone may not be cast so close to a closed door.", si.caster, FALSE);
} else if (si.clevel >= 20) {
if (!nDoor) {
oWall = CreateObject(OBJECT_TYPE_PLACEABLE, "wallofstone20", si.loc);
AssignCommand(oArea, DelayCommand(fDur, DestroyWall(oWall)));
} else
FloatingTextStringOnCreature("Wall of stone may not be cast so close to a closed door.", si.caster, FALSE);
} else {
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, si.loc, fDur);
}
}
It's fairly primitive - really, it should just spawn one place and add temp hit point, resist, and immune effects based on level. It does, however, have fairly advanced antiexploits, which are necessary if you don't want players abusing it to 'push' through tile/door obstacles.
Funky