1. Explicit conversion from IntPtr.Zero will return null reference, whereas new Critter(IntPtr.Zero) will create invalid wrapper pointing to IntPtr.Zero and possibly soon crashing the whole serv. But in init functions it's not possible for the pointer to be zero, so there is no difference here.
2. The scripts.cfg bindings are not working, because scripts.cfg won't allow you to define declaration, and take hardcoded one. And hardcoded ones are AS declarations, not mono ones, difference is:
// AS
viod funcname(int, int)
// mono
void Namespace.ClassName::Method(int,int)
so in mapper/dialog you may specify script as mono@SomeClass::Foo and have it working, but you can't do the same in scripts.cfg...
Of course you can do dirty:
// scripts.cfg
check_look some_module
// some_module
#pragma bindfunc "bool Helper(Critter&, Critter&) -> mono CheckLook::Check" // don't remember exact signature
bool check_look(Critter& cr1, Critter& cr2)
{
return Helper(cr1,cr2);
}
// mono class
class CheckLook
{
public bool static Check(IntPtr ptr1, IntPtr ptr2)
{
var cr1 = (Critter)ptr1;
var cr2 = (Critter)ptr2;
// ...
}
}